1、顺序表的基本操作实验题目顺序表的基本操作小组合作姓名班级学 号888888888一、实验目的实验(一)1.掌握顺序表的C语言描述,定义等基本操作2.将顺序表的基本操作使用C语言来实现二实验环境DevC+三、实验内容与步骤实验(一)内容:顺序表中是数据结构中的一种顺序存储结构,存储在相邻的内存单元中,其单元的地址是连续的,C语言中通常采用数组来表示顺序表数据的存储实现。顺序表作为一种抽象数据类型(ADT),有创建、添加,删除,查询等相关操作。表示顺序表时,采用结构体形式,结构体包含了顺序表的长度,数据域。(1) 创建一个顺序表,并对顺序表进行初始化(2) 对第1步创建好的顺序表,进行相关的操作步
2、骤:1 向顺序表中插入结点2 删除顺序表中的某个结点3 求顺序表的长度4 查询结点的位置5 清空顺序表四、实验过程与分析(一)用C语言编程实现以上操作1. 创建顺序表之前,先引入头文件、完成一些宏定义和定义一下顺序表:#include#include#define MAXSIZE 100#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int ElemType;typedef int Status;/定义顺序表为结构体类型 typedef struct Node ElemType *data;/数组指针形式表示数据
3、int len;/顺序表的长度 SqList;/结构体别名:SqList代替struct Node字样2. 为了便于更加直观的操作,先写一个函数,用来实现人机交互:void options() printf(*n); printf(【 1】置空顺序表n); printf(【 2】判断顺序表是否为空n); printf(【 3】求顺序表的长度n); printf(【 4】输出顺序表中第i个元素的值n); printf(【 5】获取顺序表中第一个与e相同的元素位置n); printf(【 6】获取元素的的直接前驱n); printf(【 7】获取元素的直接后继n); printf(【 8】插入元素
4、n); printf(【 9】删除顺序表的元素n); printf(【10】访问顺序表的元素n); printf(【11】输出顺序表n); printf(【12】退出n); printf(*n);3. 编写用于初始化顺序表,并对顺序表的数据进行初始化的操作:/构造一个新的顺序表 Status InitList(SqList *L) int i,n; L-data=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);/动态申请空间 if(!L-data)/如果申请的空间为空 printf(顺序表创建失败n); return ERROR; else L-len
5、=0; printf(顺序表初始化完成n); /对顺序表的数据进行初始化 printf(请输入要插入的元素个数:); scanf(%d,&n); printf(请输入元素:); for(i=0;idatai); L-len+; printf(数据初始化完毕nn);4. 置空线性表:Status ClearList(SqList *L) int i; if(L-len=0) printf(顺序表已空nn); return ERROR; for(i=L-len-1;i=0;i-) L-datai=-1; L-len-; printf(顺序表置空完毕n); return OK;5. 判断线性表是否为
6、空,如果为空返回TRUE,否则,返回FALSE:Status ListEmpty(SqList *L) if(L-len=0) return TRUE; else return FALSE; 6. 求线性表表长的函数:int ListLength(SqList *L) return L-len;7. 用e返回L中第i个元素的值void GetElem(SqList *L,int i,ElemType *e) if(iMAXSIZE) printf(下标越界nn); *e=-1; return; if(iL-len) printf(超出顺序表的范围nn); *e=-1; return; *e=L
7、-datai-1;8. 回L中第一个与e相同的元素位置int LocateElem(SqList *L,ElemType *e) int i; int loc=0; for(i=0;ilen;i+) if(L-datai=*e)/如果找到元素了 loc=i+1; break; if(i=L-len) printf(顺序表中没有找到该元素nn); loc=-1; return loc; else return loc; 9. 如果e不是第一个元素,则返回L中e的直接前驱元素 Status PriorElem(SqList *L,ElemType *e) int i; if(*e=L-data0)
8、 printf(元素%d是第一个元素,没有直接前趋nn); *e=-1; return ERROR; /说明e不是第一个元素 for(i=1;ilen;i+) if(L-datai=*e)/说明元素的直接后继是e *e=L-datai-1; printf(元素%d的直接前驱是%dnn,L-datai,*e); break; if(i=L-len) printf(顺序表中没有该元素nn); *e=-1; return ERROR; return OK;10. 如果e不是最后一个元素,则返回L中e的直接后继元素Status NextElem(SqList *L,ElemType *e) int i
9、; /e是最后一个元素 if(*e=L-dataL-len-1) printf(元素%d为最后一个元素,无直接后继nn,*e); return ERROR; for(i=0;ilen-1;i+) if(L-datai=*e) *e=L-datai+1; printf(元素%d的直接后继是%dnn,L-datai,*e); break; if(i=L-len-1) printf(顺序表中没有元素%dnn,*e); return ERROR; return OK; 11. 在顺序表的i个位置插入元素eStatus ListInsert(SqList *L,int loc,ElemType *e)
10、int i; if(locMAXSIZE) printf(下标越界nn); return ERROR; if(locL-len+1) printf(下标超出顺序表长度nn); return ERROR; if(loc=L-len) L-dataloc-1=*e; L-len+; printf(元素插入成功nn); return OK; for(i=L-len;i=loc;i-) L-datai=L-datai-1; L-datai=*e; L-len+; printf(元素插入成功nn); return OK;12. 删除顺序表的第loc个元素,并用e返回Status ListDlete(Sq
11、List *L,int loc,ElemType *e) int i; if(locMAXSIZE) printf(下标越界nn); return ERROR; if(locL-len) printf(下标超出顺序表长度nn); return ERROR; *e=L-dataloc-1; for(i=loc;ilen;i+) L-datai-1=L-datai; L-len-; printf(删除的元素是:%dnn,*e); return OK; 13. 访问顺序表的第loc个元素Status ListTraverse(SqList *L,int loc) if(locMAXSIZE) pri
12、ntf(下标越界nn); return ERROR; if(locL-len) printf(下标超出顺序表长度nn); return ERROR; printf(顺序表的第%d个元素是:%dnn,loc,L-dataloc-1); return OK; 14. 输出顺序表的元素void print(SqList *L) int i; if(iMAXSIZE) printf(顺序表为空nn); return; for(i=0;ilen;i+) printf(%d ,L-datai); printf(n顺序表输出完毕nn);15. 最后,在main函数中调用相关的操作函数:int main(vo
13、id) SqList *L; int select,i,loc,flag; ElemType e=-1; L=(SqList *)malloc(sizeof(SqList); InitList(L); while(1) options(); printf(请输入你的选择:); scanf(%d,&select); if(select=12) break; switch(select) case 1: ClearList(L); break; case 2: flag=ListEmpty(L); if(flag=TRUE) printf(顺序表为空nn); else printf(顺序表不为空n
14、n); break; case 3: i=ListLength(L); printf(顺序表中有%d个元素nn,i); break; case 4: printf(请输入查找的元素的位置:); scanf(%d,&loc); GetElem(L,loc,&e); if(e!=-1) printf(该位置的元素值是:%dnn,e); break; case 5: printf(请输入要查找的元素:); scanf(%d,&e); i=LocateElem(L,&e); if(i!=0&i!=-1) printf(元素的位置为:%dnn,i); break; case 6: printf(请输入元
15、素的值:); scanf(%d,&e); PriorElem(L,&e); break; case 7: printf(请输入元素的值:); scanf(%d,&e); NextElem(L,&e); break; case 8: printf(请输入插入的元素的位置:); scanf(%d,&loc); printf(请输入要插入的元素:); scanf(%d,&e); ListInsert(L,loc,&e); break; case 9: printf(请输入要删除的元素的位置:); scanf(%d,&loc); ListDlete(L,loc,&e); break; case 10:
16、 printf(请输入位置loc:); scanf(%d,&loc); ListTraverse(L,loc); break; case 11: print(L); break; default: break; return 0;(二)、程序运行截图1.编译运行上述程序:2.输入5个数,分别为1,2,3,4,53.求线性表是否为空:4.求线性表的长度:5.输出顺序表的第4个元素:6.输出第一次出现元素3的位置:7.向线性表中插入一个元素:8.删除元素4,并输出9.输出线性表的元素:10.在线性表的-1位置插入数据:11.清空线性表的所有元素五、实验总结1. 由于线性表是采用的是数组存储,因此,在第i个位置添加或删除一个元素时,需要移动n-i个位置,其时间复杂度为O(n)2. 顺序表的删除并非真正意义的删除,由于数组的特殊原因,只是显示的一种“假象”,如果采用动态的扩展空间,可以实现真正意义的释放空间3. 采用结构体时,访问成员,一般采用结构体变量名.成员变量名4. 采用结构体指针,访问变量,采用结构体变量名-成员变量名5. 编写相关的数据结构算法时,要注意下标小于0和指针指向为空或者下标越界等常见问题。6. 顺序表的插入、删除的时间复杂度是O(n),而访问某个元素的时间复杂度是O(1),输出所有元素的时间复杂度也是O(n).
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1