数据结构与算法——顺序表的基本操作(C语言详解版)
发布人:shili8
发布时间:2025-01-03 17:21
阅读次数:0
**数据结构与算法——顺序表的基本操作**
在计算机科学中,数据结构是指组织和存储数据的方式,而算法则是指解决问题的步骤。顺序表是一种常见的线性数据结构,它以一组连续的内存单元来存储元素。在本文中,我们将详细介绍顺序表的基本操作,包括创建、插入、删除和查找等功能。
###1. 创建顺序表创建一个顺序表涉及分配足够的内存空间来存储元素。我们可以使用动态内存分配函数 `malloc` 来实现这一点。
c// 创建一个空顺序表typedef struct { int *data; int size; } SeqList; SeqList* create_seq_list(int capacity) { // 分配足够的内存空间 SeqList* list = (SeqList*)malloc(sizeof(SeqList)); if (!list) return NULL; // 内存分配失败 list->data = (int*)malloc(capacity * sizeof(int)); if (!list->data) { free(list); return NULL; // 内存分配失败 } list->size =0; return list; }
###2. 插入元素插入元素到顺序表中涉及在指定位置添加新元素,并调整后续元素的索引。
c// 在指定位置插入一个元素void insert_at(SeqList* list, int index, int value) { if (index < 0 || index > list->size) return; // 无效的索引 // 扩容内存空间 int new_capacity = list->size +1; int* new_data = (int*)realloc(list->data, new_capacity * sizeof(int)); if (!new_data) { free(list->data); return; // 内存分配失败 } list->data = new_data; // 移动后续元素的索引 for (int i = list->size; i > index; --i) { list->data[i] = list->data[i -1]; } list->data[index] = value; list->size +=1; }
###3. 删除元素删除元素涉及从顺序表中移除指定位置的元素,并调整前后的元素索引。
c// 删除指定位置的元素void delete_at(SeqList* list, int index) { if (index < 0 || index >= list->size) return; // 无效的索引 // 移动后续元素的索引 for (int i = index +1; i <= list->size -1; ++i) { list->data[i -1] = list->data[i]; } // 缩容内存空间 int new_capacity = list->size -1; int* new_data = (int*)realloc(list->data, new_capacity * sizeof(int)); if (!new_data) { free(list->data); return; // 内存分配失败 } list->data = new_data; list->size -=1; }
###4. 查找元素查找元素涉及在顺序表中找到指定的值,并返回其索引。
c// 在顺序表中查找一个元素int find(SeqList* list, int value) { for (int i =0; i < list->size; ++i) { if (list->data[i] == value) return i; } return -1; // 未找到}
###5. 示例代码
c#include <stdio.h> #include <stdlib.h> // 创建一个空顺序表SeqList* create_seq_list(int capacity) { // 分配足够的内存空间 SeqList* list = (SeqList*)malloc(sizeof(SeqList)); if (!list) return NULL; // 内存分配失败 list->data = (int*)malloc(capacity * sizeof(int)); if (!list->data) { free(list); return NULL; // 内存分配失败 } list->size =0; return list; } // 在指定位置插入一个元素void insert_at(SeqList* list, int index, int value) { if (index < 0 || index > list->size) return; // 无效的索引 // 扩容内存空间 int new_capacity = list->size +1; int* new_data = (int*)realloc(list->data, new_capacity * sizeof(int)); if (!new_data) { free(list->data); return; // 内存分配失败 } list->data = new_data; // 移动后续元素的索引 for (int i = list->size; i > index; --i) { list->data[i] = list->data[i -1]; } list->data[index] = value; list->size +=1; } // 删除指定位置的元素void delete_at(SeqList* list, int index) { if (index < 0 || index >= list->size) return; // 无效的索引 // 移动后续元素的索引 for (int i = index +1; i <= list->size -1; ++i) { list->data[i -1] = list->data[i]; } // 缩容内存空间 int new_capacity = list->size -1; int* new_data = (int*)realloc(list->data, new_capacity * sizeof(int)); if (!new_data) { free(list->data); return; // 内存分配失败 } list->data = new_data; list->size -=1; } // 在顺序表中查找一个元素int find(SeqList* list, int value) { for (int i =0; i < list->size; ++i) { if (list->data[i] == value) return i; } return -1; // 未找到} int main() { SeqList* list = create_seq_list(10); insert_at(list,0,5); insert_at(list,2,3); delete_at(list,1); printf("%d ", find(list,5)); // 输出:0 return0; }
本文介绍了顺序表的基本操作,包括创建、插入、删除和查找等功能。示例代码展示了如何使用这些函数来管理一个顺序表。