《2022年数据结构-线性表输入,输出,插入,删除,查找》由会员分享,可在线阅读,更多相关《2022年数据结构-线性表输入,输出,插入,删除,查找(5页珍藏版)》请在金锄头文库上搜索。
1、创建一个线性表实现输入,输出,插入,删除,定位。(注意:不论在调用哪个函数前,都要先使L.elem=a,就是使指针 elem 回到数组 a 的首地址。)#include #include #include #define LIST_INIT_SIZE 100 /线性表存储空间的初始分配量#define LISTINCREMENT 10 /线性表存储空间的分配增量#define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int ElemType; /接下来 ElemType 代表的就是 int typedef int Status; /St
2、atus也代表 int int i,*p,*q; /p,q 都是指针类型ElemType e; typedef struct ElemType *elem; /定义成指针类型/存储空间基址int length; /当前长度int listsize; /当前分配的存储容量 (以 sizeof(ElemType)为单位 ) SqList; /*构建空的线性表 */ Status InitList_Sq(SqList &L) /构建一个空的线性表L L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!L.elem) exit(
3、OVERFLOW); /存储分配失败L.length=0; /空表长度为 0 L.listsize=LIST_INIT_SIZE; /初始存储容量return OK; /*线性表输入函数 */ void input(SqList &L) /输入函数 scanf(%d,L.elem); /要先输入一个,不然一开始就是0,无法进行循环while(*L.elem) / 加*是因为 elem 是指针,加之后才代表值 L.elem+; /输入后指针后移L.length+; /表长加 1 scanf(%d,L.elem); /循环中也要再输入 /*线性表打印函数 */ void print(SqList
4、&L) /输出函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - int n; for(n=0;nL.length;n+) printf(%dt, *L.elem); L.elem+; /输出后指针后移 /*线性表插入函数(在第i 个位置插入一个数据e)*/ Status ListInsert_Sq(SqList &L,int i,ElemType e)/插入函数 /在顺序线性表 L 中第 i 个位置之前插入新的元素e /i 的
5、合法值为 1=i=ListLength.Sq(L)+1 Status *newbase;指针类型。因为 elem是指针类型if(iL.length+1) return ERROR; /i 值不合法if(L.length=L.listsize) /当前存储空间已满,增加分配 newbase=(ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType); /分配存储空间if(!newbase) exit(OVERFLOW); /存储分配失败,跳回操作系统L.elem=newbase; /新基址L.listsize+=
6、LISTINCREMENT; /增加存储容量 q=&(L.elemi-1 ); /q 为插入位置for(p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; /插入位置及之后的元素右移*q=e; /插入 e +L.length; /表长增加 1 return OK; /*线性表删除函数(删除第 i 个位置, 并用 e返回删除的数据)*/ Status ListDelete_Sq(SqList &L,int i,ElemType &e)/删除函数引用调用 /在顺序线性表 L 中删除第 i 个元素,并用 e返回其值/i 的合法值为 1=i=ListLength.Sq(L
7、) if(iL.length) return ERROR; /i 值不合法p=&(L.elemi-1); /p 为被删除元素的位置e=*p; /被删除元素的值赋给e q=L.elem+L.length-1; /表尾元素的位置for(+p;p=q;+p) *(p-1)=*p; /在被删除元素位置后面的元素左移-L.length; /表长减 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - return OK; /* 线性表查找
8、(定位)函数 (找到第 1 个与 e相等的值,返回其位置 i) */ int LocateElem_Sq(SqList L,ElemType e, Status( *compare)(ElemType,ElemType)/定位函数 /在顺序线性表 L 中查找第 1 个值与 e满足 compare()的元素的位序/若找到,则返回其在L 中的位序,否则返回0 i=1; /i 的初值为第 1 个元素的位序p=L.elem; /p 的初值为第 1 个元素的存储位置while(i=L.length&!(*compare)( *p+,e) +i; /将表 L 中的元素依次与 e 进行比较if(i=L.le
9、ngth) return i; else return 0; /*比较函数 */ Status Compare( ElemType m,ElemType e) /比较的是实数,不用定义成指针 if(m=e) return OK; else return ERROR; /*主函数 */ void main() SqList L; int a100; if(InitList_Sq(L) L.elem=a; /将数组的首地址赋给指针elem printf( 请输入数据: n); input(L); /输入线性表 L L.elem=a; /指针 elem回到数组首地址,/因为在用的过程中指针已经移动,
10、所以必须归位,才能再从第一个用起。printf( 您输入的数据为: n); print(L); /输出线性表 L printf(n); printf( 请输入插入元素的位置 :); scanf(%d,&i); printf( 请输入新元素 :); scanf(%d,&e); /指针 elem回到数组首地址L.elem=a; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - if(ListInsert_Sq(L,i,e) /在指定位
11、置插入待插入元素 printf( 插入元素后的表含 %d 个元素 :n,L.length); L.elem=a; print(L); /输出插入元素后的新表L printf(n); L.elem=a; /指针 elem 回到数组首地址printf( 请输入删除元素的位置 :); scanf(%d,&i); if(ListDelete_Sq(L,i,e) /删除指定元素 printf( 您删除的元素为 :%dn,e); printf( 删除元素后的表含 %d 个元素 n,L.length); L.elem=a; /指针 elem 回到数组首地址print(L); /输出删除元素后的新表L pri
12、ntf(n); L.elem=a; /指针 elem 回到数组首地址printf( 请输入您要找的元素的值:); scanf(%d,&e); if(LocateElem_Sq(L,e,Compare) /找出指定元素在表L 中的位序printf( 元素%d 在顺序线性表 L 的位序为 :%dn,e,i); else printf( 您输入的元素不在表L 中n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -