线性表的总结:顺序存储线性表的初始化,创建,插入,删除,清空,销毁等操作
由于数据结构放置了很久,对一些基本的操作有些遗忘,于是近期重新开启了数据结构的学习模式。本文只要讲述了顺序存储线性表的一些基本操作,对于老鸟老说可能偏简单,但是对于新手或者很久没碰线性表的读者来说,还是比较有价值的,代码我都一一调试过。且必要的地方,我也做了详细的注释,这样也为自己后期学习做了一个remark。欢迎有兴趣的小伙伴跟我在站内交流互动,后期我会持续更新。
这是我的学习代码:
#include "stdafx.h" #include "malloc.h" #include "stdio.h" #define MAXSIZE 20 //一般顺序线性表的最大长度是固定的 #define LIST_INI_LENGTH 5 //初始化时线性表的长度 #define OK 1 #define ERROR 0 #define TRUE 0 #define FALSE 0 typedef int Status;//函数的类型,其值是函数结果状态代码 typedef int ElemType;//定义线性表元素类型 typedef struct //定义一个顺序存储结构类类型 { ElemType data[MAXSIZE];//线性表的数据元素 int cur_length;//线性表的当前长度 }SqList; Status ListInitial(SqList *L)//线性表的初始化 { L =(SqList*) malloc(MAXSIZE*sizeof(SqList));//为线性表分配内存,注:这里一定要强制类型转换 if (L == NULL) printf("初始化失败!"); L->cur_length = 0;//初始化时线性表分配的长度 //for (int i = 0; i < LIST_INI_LENGTH;i++) // L->data[i] = 0; return OK; } Status ListCreate(SqList *L)//线性表的创建,一般发生在初始化之后 { int i, n=0; printf("请在键盘输入即将创建的线性表长度:\n"); scanf_s("%d", &n);//读者可以尝试把这条语句改成scanf_s("%d\n", &n),看运行结果 L->cur_length = n; printf("请在键盘输入即将创建的线性表中的元素:\n"); for (i = 0; i <n; i++) { scanf_s("%d", &L->data[i]);//注意小细节,读者可以把这条语句改成scanf_s("%d\n", &L->data[i]),然后分析运行结果 } return OK; } Status ListClear(SqList *L)//线性表的清空 { int i; for (i = 0; i < L->cur_length; i++) L->data[i] = 0; L->cur_length = 0; return OK; } Status ListDestory(SqList L)//线性表的销毁 { free(L.data); return OK; } Status ListInsert(SqList *L, int i, ElemType e)//在L中的第i个位置之前插入新的数据元素e,L的长度加1 { int k; if (L->cur_length == MAXSIZE)//顺序表已满 return ERROR; if (i<1 || i>L->cur_length)//当插入位置i不在线性表范围内时 return ERROR; if (i < L->cur_length)//若插入数据的位置不在表尾 { for (k = L->cur_length - 1; k >= i - 1; k--) L->data[k + 1] = L->data[k]; } L->data[i - 1] = e;//将新元素插入 L->cur_length++;//新元素插入后,线性表的长度加1 return OK; } Status ListDelete(SqList *L, int i, ElemType *e)//删除线性表L的第i个元素,并用e返回其值,L的长度减1 { int k; if (L->cur_length == 0) return ERROR; if (i<1 || i>L->cur_length)//当删除位置i不在线性表范围内时 return ERROR; *e = L->data[i - 1]; if (i < L->cur_length)//若删除的数据的位置不在表尾 { for (k = i; k<L->cur_length; k++) L->data[k-1] = L->data[k]; } L->cur_length--;//删除元素后,线性表的长度减1 return OK; } Status GetElem(SqList L, int i, ElemType *e)//获得第i个元素的操作 { if (L.cur_length == 0 || i<1 || i>L.cur_length) return ERROR; *e = L.data[i - 1]; return OK; } int main()//主测试函数 { SqList L1 = {NULL};//还可以定义为*L1 Status ListInitial(SqList &L1);//初始化线性表 printf("初始化后线性表的长度为:"); printf("%d\n", L1.cur_length); ListCreate(&L1);//创建线性表 printf("当前线性表的长度为:"); printf("%d\n", L1.cur_length); //SqList L2; ElemType f; ElemType a=1,b=2,e; ListInsert(&L1, 1, a); ListInsert(&L1, 2, b); printf("插入元素后输出当前的线性表的实际长度为:"); printf("%d\n", L1.cur_length); ListDelete(&L1, 2, &f); printf("输出被删除的元素:"); printf("%d\n", f); printf("删除元素后线性表的实际长度为:"); printf("%d\n", L1.cur_length); printf("输出线性表最后剩下的元素:\n"); for (int j = 0; j < L1.cur_length; j++) { printf("%d\n", L1.data[j]); } GetElem(L1, 2, &e);//获取线性表中的第二个元素 printf("输出获取的第2个元素:"); printf("%d\n", e); ListClear(&L1);//清空线性表,这个函数需要采用地址传递,而不能定义为Status ListClear(SqList L) printf("输出线性表此刻的长度:"); printf("%d\n", L1.cur_length); return 0; }
下面是根据键盘提示输入数据后,我创建的顺序线性表的长度为5,下面代码的具体运行结果,代码的运行过程我再这里就不赘述了:
初始化后线性表的长度为:0 请在键盘输入即将创建的线性表长度: 5 请在键盘输入即将创建的线性表中的元素: 1 2 3 4 5 当前线性表的长度为:5 插入元素后输出当前的线性表的实际长度为:7 输出被删除的元素:2 删除元素后线性表的实际长度为:6 输出线性表最后剩下的元素: 1 1 2 3 4 5 输出获取的第2个元素:1 输出线性表此刻的长度:0 请按任意键继续. . .
本文为作者原创,欢迎转载,转载请注明出处。