顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。一般情况下用数组存储。在数组上完成数据的增删查改。
代码解析:
1.首先对一些头文件的引用和创建一个结构体,结构体包含一个数组,size表示该数组目前有多少个元素,capacity表示目前数组能存多少个元素。例如:
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<asrt.h> typede食品安全宣传周活动方案f int datatype;typedef struct qlist{datatype* a;int size;int capacity;}sl;
2.创建一个顺序表
sl sl;
注意这里的参数得是指针,形参是实参的一份临时拷贝,所以得把地址传给函数才能改变值。
void qlistinit(sl* sl){sl->a = null;sl->size = 0;sl->capacity = 0;}
写尾插函数之前我们得先判断婚礼发言一下数组空间是否够。例如下面的例子。
所以我们要先检查空间是否满了,满了就扩容
将这个判断空间函数命名为 void checkspace(sl* sl) (这是动态顺序表区别于静态顺序表最主要的部分)
void checkspace(sl* sl){if (sl->size == sl->capacity){//因为capacity一开始等于0,所以先给capacity一个值int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;datatype* tmp = (datatype*)realloc(sl->a, sizeof(datatype)*newcapacity);if (tmp == null){printf("开辟失败\n");exit(-1);}el{sl->capacity = newcapacity;sl->a = tmp;}}}
尾插函数:
void qlistpushback(sl* sl, datatype x){checkspace(sl);sl->a[sl->size] = x;sl->size++;}
void qlistpushfront(sl* sl, datatype x){//因为插入的时候都要检查空间是不是满了,满了就扩容checkspace(sl);for (int end = sl->size - 1; end >= 0; end--){sl->a[end + 1] = sl->a[end];}sl->a[0] = x;sl->size++;}
挪数据对应着for循环的代码,最后再给数组的第一个位置赋值。别忘了对size+1.
如果size等于0了就说明顺序表中没有数据了,所以
void qlistpopback(sl* sl){asrt(sl->size > 0);sl->size--;}
从第二个数据开始整体往前挪以为就可以了。(要从前面开始挪):
void qlistpopfront(sl* sl){for (int i = 1; i < sl->size; i++){sl->a[i - 1] = sl->a[i];}sl->size--;}
首先pos不能小于现有的数据个数。
第二判断空间,满了就扩容。
第三:从第pos个位置的数据开始(这里第pos个位置的数据在数组中的下标是pos-1)将后面的数据整体往后挪一位。
第四:再这个位置赋值,别忘了对size++;
void qlistinrt(sl* sl, int pos, datatype x){//查看空间asrt(pos <= sl->size);checkspace(sl);for (int end = sl->size-1; end >= pos-1; end--)//这里不能用sl->size--{sl->a[end+1] = sl->a[end];}sl->a[pos - 1] = x;sl->size++;}
首先pos不能小于现有数据个数
第二:将从第pos个位置的数据开始到最后一个数据往前挪一位
第三:对size–
void qlistera(sl* sl, int pos){asrt(pos <=sl->size);for (int i = pos; i < sl->size; i++){sl->a[i - 1] = sl->a[i];}sl->size--;}
一:pos不能小于现有数据个数
二:赋值。第pos个位置的数据在数组中下标是pos-1。(因为数组下表从0开始)
void qlistmodify(sl* sl, int pos, datatype x){asrt(pos <= sl->size);sl->a[pos - 1] = x;}
遍历一遍看是否有这个数据,有就返回数据是第几个元素。(这里我不是返回该数据在数组中的下标,我是返回 下标+1)
这里我没有考虑如果有两个一样的数据的情况。
int qlistfind(sl* sl, datatype x){for (int i = 0; i < sl->size;i++){if (sl->a[i] 有志者事竟成作文== x){i++;printf("在第%d个位置\n", i);return i;}}printf("没有此数据\n");return -1;}
释放sl->a之后要对它置空,因为指针free之后,free函数只是把指针指向的内存空间释放了,即内存中存储的值,但是并没有将指针的值赋为null,指针仍然指向这块内存。
void qlistdestory(sl* sl){free(sl->a);sl->a = null;sl->size = 0;sl->capacity = 0;}
void qlistprint(sl* sl){for (int i = 0; i < sl->size;i++){printf("%d ", sl->a[i]);}printf("\n");}
菜单写的比较简单。
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<asrt.h> typedef int datatype;typedef struct qlist{datatype* a;int size;int capacity;}sl; void qlistinit(sl* sl){sl->a = null;sl->size = 0;sl->capacity = 0;} void qlistprint(sl* sl){for (in空山不见人下一句t i = 0; i < sl->size; i++){printf("%d ", sl->a[i]);}printf("\n");} void checkspace(sl* sl){if (sl->size == sl->capacity){//因为capacity一开始等于0,所以先给capacity一个值int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;datatype* tmp = (datatype*)realloc(sl->a, sizeof(datatype)*newcapacity);if (tmp == null)几个字的个性签名{printf("开辟失败\n");exit(-1);}el{sl->capacity = newcapacity;sl->a = tmp;}}} void qlistpushback(sl* sl, datatype x){//看空间是不是满了,满了就扩容//if (sl->size == sl->capacity)//{////因为capacity一开始等于0,所以先给capacity一个值//int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;//datatype* tmp = (datatype*)realloc(sl->a, sizeof(datatype)*newcapacity);//if (tmp == null)//{//printf("开辟失败\n");//exit(-1);//}//el//{//sl->a = tmp;//}//}//封装成一个函数checkspace(sl);sl->a[sl->size] = x;sl->size++;} void qlistpushfront(sl* sl, datatype x){//因为插入的时候都要检查空间是不是满了,满了就扩容checkspace(sl);for (int end = sl->size - 1; end >= 0; end--){sl->a[end + 1] = sl->a[end];}sl->a[0] = x;sl->size++;} void qlistpopback(sl* sl){asrt(sl->size > 0);sl->size--;} void qlistpopfront(sl* sl){for (int i = 1; i < sl->size; i++){sl->a[i - 1] = sl->a[i];}sl->size--;} void qlistinrt(sl* sl, int pos, datatype x){//查看空间asrt(pos <= sl->size);checkspace(sl);for (int end = sl->size - 1; end >= pos - 1; end--)//这里不能用sl->size--{sl->a[end + 1] = sl->a[end];}sl->a[pos - 1] = x;sl->size++;} void qlistera(sl* sl, int pos){asrt(pos <= sl->size);for (int i = pos; i < sl->size; i++){sl->a[i - 1] = sl->a[i];}sl->size--;} void qlistmodify(sl* sl, int pos, datatype x){asrt(pos <= sl->size);sl->a[pos - 1] = x;} int qlistfind(sl* sl, datatype x){for (int i = 0; i < sl->size; i++){if (sl->a[i] == x){i++;printf("在第%d个位置\n", i);return i;}}printf("没有此数据\n");return -1;} void qlistdestory(sl* sl){free(sl->a);sl->a = null;sl->size = 0;sl->capacity = 0;} void menu(){printf("******************************\n");printf("*** 1.尾插数据 2.头插数据 ***\n");printf("*** 3.在第pos个位置插入数据***\n");printf("*** 4.尾删数据 5.头删数据 ***\n");printf("*** 6.在第pos个位置删除数据***\n");printf("*** 7.修改第pos个位置的数据***\n");printf("*** 8.查找数据 9.打印数据 ***\n");printf("********** -1.退出 ***********\n");printf("******************************\n");}int main(){sl sl;qlistinit(&sl);int option = 0;int x = 0;int pos = 1;while (option != -1){menu();scanf("%d", &option);switch (option){ca 1:printf("请输入要插入的数据,以-1结束:\n");do{scanf("%d", &x);if (x != -1){qlistpushback(&sl, x);}} while (x != -1);break;ca 2:printf("请输入要插入的数据,以-1结束:\n");do{scanf("%d", &x);if (x != -1){qlistpushfront(&sl, x);}} while (x != -1);break;ca 3:printf("请输入要插入的数据,要从第几个插入,以非正正数结束\n");do{scanf("%d", &x);scanf("%d", &pos);if (pos >= 0){qlistinrt(&sl, pos, x);}} while (pos >= 0);break;ca 4:qlistpopback(&sl);break;ca 5:qlistpopfront(&sl);break;ca 6:printf("请输入要删除第几个位置的数据,以非正正数结束\n");do{scanf("%d", &pos);if (pos>0){qlistera(&sl, pos);}} while (pos>0);break;ca 7:printf("请输入要修改的数据,要修改第几个数据,以非正整数结束\n");do{scanf("%d", &x);scanf("%d", &pos);if (pos>0){qlistinrt(&sl, pos, x);}} while (pos>0);break;ca 8:printf("请输入需要查找的数据\n");scanf("%d", &x);qlistfind(&sl, x);break;ca 9:qlistprint(&sl);break;ca -1:printf("退出\n");break;default:printf("输入错误,请重新输入\n");}}qlistdestory(&sl);return 0;}
到此这篇关于c语言动态顺序表实例代码的文章就介绍到这了,更多相关c语言顺序表内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 04:05:41,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/a5dd458481fa6a538f7263b4be786a9b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C语言动态顺序表实例代码.doc
本文 PDF 下载地址:C语言动态顺序表实例代码.pdf
留言与评论(共有 0 条评论) |