数据结构-顺序表-代码实现(c语言版)

使用c语言实现对顺序表的增删改查操作:

定义顺序表结构体

typedef struct {
	int* elements;
	size_t size;
	size_t capacity;
} SequentialList;

1.初始化顺序表 

//初始化顺序表
void SequentialListInit(SequentialList* list, int capactiy) {
	list->elements = (int*)malloc(sizeof(int) * capactiy);
	list->size = 0;
	list->capacity = capactiy;
}

2.销毁顺序表

//销毁顺序表
void SequentialListDestroy(SequentialList* list) {
	if (list->elements) {
		free(list->elements);
		list->capacity = 0;
	}
}

3.获取顺序表的大小 

//获取顺序表的大小
size_t SequentialListSize(const SequentialList* list) {
	return list->size;
}

4.插入操作

//1.插入操作
void SequentialListInsert(SequentialList* list, int index, int element) {
	//判断索引是否合法
	if (index < 0 || index > list->size) {
		printf("Invalid index\n");
		return;
	}
	
	//判断顺序表容量
	if (list->size == list->capacity) {
		//进行扩容
		int* newElements = (int*)realloc(list->elements, sizeof(int) * list->capacity * 2);
		if (newElements) {	//如果扩容失败,返回
			printf("Failed to allocate memory\n");
			return;
		}
		//把新地址赋值给elements
		list->elements = newElements;
		list->capacity *= 2;
	}

	//移动元素
	for (size_t i = list->size; i > index; --i) {
		list->elements[i] = list->elements[i - 1];
	}
	
	//插入元素
	list->elements[index] = element;

	//更新顺序表大小
	list->size++;

	//更新顺序表容量
	list->capacity--;

}

5.删除元素操作 

//2.删除元素操作
void SequentialListDelete(SequentialList* list, int index) {
	//判断索引是否合法
	if (index < 0 || index > list->capacity) {
		printf("Invalid index\n");
		return;
	}

	//移动元素,把索引后的元素往前挪
	for (size_t i = index; i < list->size; ++i) {
		list->elements[i] = list->elements[i + 1];
	}

	//更新顺序表大小
	list->size--;

	//更新顺序表容量
	list->capacity++;
}

6. 元素查找操作

//元素的查找操作
size_t SequentialListFind(SequentialList* list, int element) {
	//遍历顺序表进行查找
	for (size_t i = 0; i < list->size; i++) {
		if (list->elements[i] == element) {
			return i;
		}
	}
	return -1;
}

7.顺序表的索引 

//顺序表的索引
size_t SequentialListIndex(SequentialList* list, int index) {
	//判断索引是否合法
	if (index < 0 || index > list->size) {
		printf("Invalid index\n");
		return 0;
	}

	//找到索引对应值返回
	return list->elements[index];
}

8. 修改元素操作

//修改元素操作
void SequentialListSet(SequentialList* list, int index, int element) {
	//判断给定索引是否合法
	if (index < 0 || index > list->size) {
		printf("Invalid index\n");
		return;
	}

	//找到索引对应位置赋值
	list->elements[index] = element;
		 
}

最终代码:

#include 
#include 

typedef struct {
	int* elements;
	size_t size;
	size_t capacity;
} SequentialList;

//初始化顺序表
void SequentialListInit(SequentialList* list, int capactiy) {
	list->elements = (int*)malloc(sizeof(int) * capactiy);
	list->size = 0;
	list->capacity = capactiy;
}

//销毁顺序表
void SequentialListDestroy(SequentialList* list) {
	if (list->elements) {
		free(list->elements);
		list->capacity = 0;
	}
}

//获取顺序表的大小
size_t SequentialListSize(const SequentialList* list) {
	return list->size;
}

//1.插入操作
void SequentialListInsert(SequentialList* list, int index, int element) {
	//判断索引是否合法
	if (index < 0 || index > list->size) {
		printf("Invalid index\n");
		return;
	}
	
	//判断顺序表容量
	if (list->size == list->capacity) {
		//进行扩容
		int* newElements = (int*)realloc(list->elements, sizeof(int) * list->capacity * 2);
		if (newElements) {	//如果扩容失败,返回
			printf("Failed to allocate memory\n");
			return;
		}
		//把新地址赋值给elements
		list->elements = newElements;
		list->capacity *= 2;
	}

	//移动元素
	for (size_t i = list->size; i > index; --i) {
		list->elements[i] = list->elements[i - 1];
	}
	
	//插入元素
	list->elements[index] = element;

	//更新顺序表大小
	list->size++;

	//更新顺序表容量
	list->capacity--;

}

//2.删除元素操作
void SequentialListDelete(SequentialList* list, int index) {
	//判断索引是否合法
	if (index < 0 || index > list->capacity) {
		printf("Invalid index\n");
		return;
	}

	//移动元素,把索引后的元素往前挪
	for (size_t i = index; i < list->size; ++i) {
		list->elements[i] = list->elements[i + 1];
	}

	//更新顺序表大小
	list->size--;

	//更新顺序表容量
	list->capacity++;
}

//元素的查找操作
size_t SequentialListFind(SequentialList* list, int element) {
	//遍历顺序表进行查找
	for (size_t i = 0; i < list->size; i++) {
		if (list->elements[i] == element) {
			return i;
		}
	}
	return -1;
}


//顺序表的索引
size_t SequentialListIndex(SequentialList* list, int index) {
	//判断索引是否合法
	if (index < 0 || index > list->size) {
		printf("Invalid index\n");
		return 0;
	}

	//找到索引对应值返回
	return list->elements[index];
}

//修改元素操作
void SequentialListSet(SequentialList* list, int index, int element) {
	//判断给定索引是否合法
	if (index < 0 || index > list->size) {
		printf("Invalid index\n");
		return;
	}

	//找到索引对应位置赋值
	list->elements[index] = element;
		 
}


int main() {

	//定义顺序表对象
	SequentialList list;
	
	//初始化顺序表
    SequentialListInit(&list,1);

	//把0-90插入到顺序表中
    for (int i = 0; i < 10; i++) {
        SequentialListInsert(&list, i, i*10);
    }

	//打印顺序表大小
	printf("Szie:%d\n", SequentialListSize(&list));

	//获取索引为2的元素
	int element = SequentialListIndex(&list, 2);
    printf("Index 2: %d\n", element);

	//查找15这个元素
    int index = SequentialListFind(&list, 15);
    printf("Index of 15: %d\n", index);

	//把索引为3的元素变成60
    SequentialListSet(&list, 3, 60);

	//遍历整个顺序表打印所有的元素
    for (int i = 0; i < list.size; i++) {
        printf("%d ", list.elements[i]);
    }

	//销毁顺序表
    SequentialListDestroy(&list);

	return 0;
}

运行结果:

数据结构-顺序表-代码实现(c语言版)_第1张图片

 

你可能感兴趣的:(数据结构基础,数据结构,c语言,算法)