「今天是学习C语言第 145 天」
纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」# 顺序表
顺序表使用一组连续的物理内存存储地址按照次序存放线性表的元素。
实现要点:
1.顺序表的长度可变。
2.利用C语言的动态内存分配函数,动态分配内存,增加顺序表长度。
3.顺序表初始分配一定大小的存储空间,当空间不足时,再次申请一定增量的空间。
优缺点:
1.顺序表具备随机存取特性,直接根据内存位置访问数据。
2.顺序表插入和删除操作,需要移动大量元素。
因此:顺序表适用于很少进行插入、删除操作,经常进行大量查询修改操作的场景。
# 使用示例
功能:输入数据个数和数据,逆序保存到顺序表,并逆序输出显示到屏幕。
运行结果如下:
请输入数据个数:10
请输入10个整数:0 1 2 3 4 5 6 7 8 9
顺序表输出结果:9 8 7 6 5 4 3 2 1 0
顺序表删除5位置元素后输出结果:9 8 7 6 4 3 2 1 0
# 代码实现
/* ========================================== 名称 :C语言实现常用数据结构 功能 :顺序表 环境 :Windows 10 + Dev-C++编译 作者 :一只会C的猫 公众号 :C语言大全(coderpointer) 时间 :2020.8.2 ==========================================*/#include #include // 定义顺序表// 顺序表初始分配的内存大小 #define LIST_INIT_SIZE 5// 顺序表内存大小增量 #define LIST_INSCREMENT_SIZE 10typedef struct { // 存储数据的内存首地址 int *pdata; // 顺序表长度,保存数据的个数 int length; // 顺序表存储空间大小 int size;}sqlist; // 创建和初始化 sqlist *create_init_sqlist(){ sqlist *list = (sqlist *)malloc(sizeof(sqlist)); if(list == NULL) return NULL; // 分配内存空间 list->pdata = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); if(list->pdata == NULL) { free(list); return NULL; } list->length = 0; list->size = LIST_INIT_SIZE; return list;}// 增加 int insert_sqlist(sqlist *list, int data, int pos) { if(list == NULL || pos < 1 || pos > list->length+1) return -1; // 空间已满,需要增加空间 if(list->length >= list->size) { list->pdata = (int *)realloc(list->pdata, \ (list->size + LIST_INSCREMENT_SIZE)*sizeof(int)); if(list->pdata == NULL) return -1; list->size += LIST_INSCREMENT_SIZE; } // 将pos位置开始的数据后移 int i; for(i=list->length; i>=pos; i--) (list->pdata)[i] = (list->pdata)[i-1]; (list->pdata)[pos-1] = data; ++list->length; return 0;}// 删除 int delete_sqlist(sqlist *list, int *data, int pos){ if(list==NULL || pos < 1 || pos > list->length+1) return -1; // 将pos位置之后的数据前移 *data = (list->pdata)[pos-1]; int i; for(i=pos; i<=list->length-1;i++) (list->pdata)[i-1] = (list->pdata)[i]; --list->length; return 0; }// 查看 void print_sqlist(sqlist *list){ if(list != NULL) { int i; for(i=0; i<list->length; i++) printf("%d ", (list->pdata)[i]); printf("\n"); } } // 销毁void free_sqlist(sqlist *list){ if(list != NULL) { list->length = 0; list->size = 0; free(list->pdata); free(list); }}int main(void){ sqlist *list = create_init_sqlist(); int n,d; printf("请输入数据个数:"); scanf("%d", &n); printf("请输入%d个整数:", n); int i; for(i=0; i { scanf("%d", &d); // 每次插入到顺序表首位,这样实现倒序 insert_sqlist(list, d, 1); } printf("顺序表输出结果:"); print_sqlist(list); printf("顺序表删除%d位置元素后输出结果:",n/2); delete_sqlist(list, &d, n/2); print_sqlist(list); free_sqlist(list); return 0;}
---------- End ----------
往期精彩推荐:
一万分钟C语言学习计划:2020开篇
C语言内存管理的两种方式
C89标准库功能简介
C语言链接与存储类型
C语言标准输入输出
C语言入门基本语法
更多请点击公众号历史文章...
「喜欢C请赏个 赞 点击右下角 在看」