1、数据结构实验线性表基本操作学数据结构课程实验报告实 验 名 称: 线性表基本操作的实现 实验室(中心): 学 生 信 息: 专 业 班 级: 指 导 教 师 : 实验完成时间: 2016 实验一 线性表基本操作的实现一、实验目的1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。2.掌握线性表的顺序存储结构的定义及C语言实现。3.掌握线性表的链式存储结构单链表的定义及C语言实现。4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。5.掌握线性表在链式存储结构单链表中的各种基本操作。二、实验内容及要求1.顺序线性表的建立、插入、删除及合并。2.链式线性表的建立、插入、删除及连接。三、实验设备
2、及软件计算机、Microsoft Visual C+ 6.0软件四、设计方案(算法设计) 采用的数据结构本程序顺序表的数据逻辑结构为线性结构,存储结构为顺序存储;链表的数据逻辑结构依然为线性结构,存储结构为链式结构。 设计的主要思路1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度,顺序表的长度和元素由用户输入;2.利用前面建立的顺序表,对顺序表进行插入、删除及合并操作;3.建立一个带头结点的单链表,结点的值域为整型数据,链表的元素由用户输入;4.对前面建立的链表进行插入、删除及连个链表的连接操作; 算法描述1、顺序表void Init(sqlist &);/初始化顺序表BOO
3、L Inse(sqlist &,int,char); /在线性表中插入元素BOOL del(sqlist&,int,char &); /在线性表中删除元素int Loc(sqlist,char); /在线性表中定位元素void print(sqlist); /输出顺序表void combine( sqlist & , sqlist & , sqlist &);/两个线性表的合并2、链表void CreaL(LinkList &,int); /生成一个单链表BOOL LInsert(LinkList &,int,char); /在单链表中插入一个元素BOOL LDele(LinkList &,i
4、nt,char &); /在单链表中删除一个元素BOOL LFind_key(LinkList,char,int &); /按关键字查找一个元素BOOL LFind_order(LinkList,char &,int); /按序号查找一个元素void LPrint(LinkList); /显示单链表所有元素void LUnion(LinkList &,LinkList &,LinkList &,int); /两个链表的连接五、程序代码1、顺序表#include #include #define Max 116enum BOOLFalse,True;typedef struct char ele
5、mMax; /线性表 int last; /last指示当前线性表的长度sqlist; void Init(sqlist &);BOOL Inse(sqlist &,int,char); /在线性表中插入元素BOOL del(sqlist&,int,char &); /在线性表中删除元素int Loc(sqlist,char); /在线性表中定位元素void print(sqlist); void combine( sqlist & , sqlist & , sqlist &);void main()sqlist L1;sqlist L2;sqlist L3;int loc,S=1;char
6、j,ch;BOOL temp;printf(本程序用来实现顺序结构的线性表。n);printf(可以实现查找、插入、删除、两个线性表的合并等操作。n);Init(L1); while(S) printf(n请选择:n); printf(1.显示所有元素n); printf(2.插入一个元素n); printf(3.删除一个元素n); printf(4.查找一个元素n); printf(5.线性表的合并n); printf(6.退出程序nn); scanf( %c,&j); switch(j) case 1:print(L1); break; case 2:printf(请输入要插入的元素(一个
7、字符)和插入位置:n); printf(格式:字符,位置;例如:a,2n); scanf(%c,%d,&ch,&loc); temp=Inse(L1,loc,ch); if(temp=False) printf(插入失败!n); else printf(插入成功!n); print(L1); break; case 3:printf(请输入要删除元素的位置:); scanf(%d,&loc); temp=del(L1,loc,ch); if(temp=True) printf(删除了一个元素:%cn,ch); else printf(该元素不存在!n); printf(删除该元素后的线性表为:
8、); print(L1); break; case 4:printf(请输入要查找的元素:); scanf( %c,&ch); loc=Loc(L1,ch); if(loc!=-1) printf(该元素所在位置:%dn,loc+1); else printf(%c 不存在!n,ch); break; case 5:printf(请输入要进行合并的第二个线性表:); Init(L2); combine(L1,L2,L3); printf(合并前的两个线性表如下:n); print(L1); print(L2); printf(输出合并后的线性表如下:n); print(L3); break;
9、default:S=0;printf(程序结束,按任意键退出!n); getch();void Init(sqlist &v)/初始化线性表 int i; printf(请输入初始线性表长度:n=); scanf(%d,&v.last); printf(请输入从1到%d的各元素(字符),例如:abcdefgn,v.last); getchar(); for(i=0;iv.last;i+) scanf(%c,&v.elemi); BOOL Inse(sqlist &v,int loc,char ch) /插入一个元素,成功返回True,失败返回False int i; if(locv.last+
10、1) printf(插入位置不合理!n); return False; else if(v.last=Max) printf(线性表已满!n); return False; else for(i=v.last-1;i=loc-1;i-) v.elemi+1=v.elemi; v.elemloc-1=ch; v.last+; return True; BOOL del(sqlist &v,int loc,char &ch) /删除一个元素,成功返回True,并用ch返回该元素值,失败返回False int j; if(locv.last) return False; else ch=v.elem
11、loc-1; for(j=loc-1;jv.last-1;j+) v.elemj=v.elemj+1; v.last-; return True; int Loc(sqlist v,char ch)/在线性表中查找ch的位置,成功返回其位置,失败返回-1 int i=0; while(iv.last&v.elemi!=ch) i+; if(v.elemi=ch) return i; else return(-1);void print(sqlist v) /显示当前线性表所有元素 int i; for(i=0;iv.last;i+) printf(%c ,v.elemi); printf(n)
12、;void combine( sqlist &s1 , sqlist &s2 , sqlist &s3 )/顺序表的连接 int i=0 ; int j=0 ; int k=0 ; while( i s1.last & j s2.last) if(s1.elemi=s2.elemj) s3.elemk=s1.elemi; i+; else s3.elemk=s2.elemj; j+; k+; if(i=s1.last) while(js2.last) s3.elemk=s2.elemj; k+; j+; if(j=s2.last) while(is1.last) s3.elemk=s1.ele
13、mi; k+; s3.last=k;2、链表的操作#include #include #include #define LEN sizeof(LNode) enum BOOLFalse,True; typedef struct node char data; struct node *next;LNode,*LinkList;void CreaL(LinkList &,int); /生成一个单链表BOOL LInsert(LinkList &,int,char); /在单链表中插入一个元素BOOL LDele(LinkList &,int,char &); /在单链表中删除一个元素BOOL L
14、Find_key(LinkList,char,int &); /按关键字查找一个元素BOOL LFind_order(LinkList,char &,int); /按序号查找一个元素void LPrint(LinkList); /显示单链表所有元素void LUnion(LinkList &,LinkList &,LinkList &,int); /两个链表的连接void main() LinkList L; LinkList T; LinkList H; BOOL temp; int num,num1,loc,flag=1; char j,ch; printf(本程序实现链式结构的线性表的操
15、作。n); printf(可以进行插入,删除,定位,查找等操作。n); printf(请输入初始时链表长度:); scanf(%d,&num); CreaL(L,num); LPrint(L); while(flag) printf(请选择:n); printf(1.显示所有元素n); printf(2.插入一个元素n); printf(3.删除一个元素n); printf(4.按关键字查找元素n); printf(5.按序号查找元素n); printf(6.链表的连接n); printf(7.退出程序n); scanf( %c,&j); switch(j) case 1:LPrint(L);
16、 break; case 2:printf(请输入元素(一个字符)和要插入的位置:n); printf(格式:字符,位置;例如:a,3n); scanf( %c,%d,&ch,&loc); temp=LInsert(L,loc,ch); if(temp=False) printf(插入失败!n); else printf(插入成功!n); LPrint(L); break; case 3:printf(请输入要删除的元素所在位置:); scanf(%d,&loc); temp=LDele(L,loc,ch); if(temp=False) printf(删除失败!n); else printf
17、(成功删除了一个元素:%cn,ch); LPrint(L); break; case 4:if(L-next=NULL) printf(链表为空!n); else printf(请输入要查找的元素(一个字符):); scanf( %c,&ch); temp=LFind_key(L,ch,loc); if(temp=False) printf(没有找到该元素!n); else printf(该元素在链表的第%d个位置。n,loc); break; case 5:if(L-next=NULL) printf(链表为空!n); else printf(请输入要查找的位置:); scanf(%d,&l
18、oc); temp=LFind_order(L,ch,loc); if(temp=False) printf(该位置不存在!n); else printf(第%d个元素是:%cn,loc,ch); break; case 6:if(L-next=NULL) printf(链表为空!n); else printf(请输入第二个链表的长度:); scanf(%d,&num1); CreaL(T,num1); if(T-next=NULL) printf(第二个链表为空!n); LUnion(L,T,H,num+num1); printf(输出连接后链表中的所有元素:); printf(n); LP
19、rint(H); break; default:flag=0;printf(程序结束,按任意键退出!n); getch();void CreaL(LinkList &v,int n)/生成一个带头结点的有n个元素的单链表 int i; LinkList p; v=(LinkList)malloc(LEN); v-next=NULL; printf(请输入%d个字符:例如:abcdefgn,n); getchar(); for(i=n;i0;-i) p=(LinkList)malloc(LEN); scanf(%c,&p-data); p-next=v-next; v-next=p; BOOL
20、LInsert(LinkList &v,int i,char e)/在单链表的第i各位置插入元素e,成功返回True,失败返回False LinkList p,s; int j=0; p=v; while(p&jnext;+j; if(!p|ji-1) return False; s=(LinkList)malloc(LEN); s-data=e; s-next=p-next; p-next=s; return True;BOOL LDele(LinkList &v,int i,char &e)/在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False LinkL
21、ist p,q; int j=0; p=v; while(p-next&jnext;+j; if(!(p-next)|ji-1) return False; q=p-next;p-next=q-next; e=q-data; free(q); return True;BOOL LFind_key(LinkList v,char e,int &i)/在单链表中查找关键字为e的元素,成功返回True,并用i返回该元素位置,失败返回False i=1; LinkList p; p=v-next; while(p-data!=e)&(p-next!=NULL) p=p-next; i+; if(p-d
22、ata!=e) return False; else return True;BOOL LFind_order(LinkList v,char &e,int i)/在单链表中查找第i个元素,成功返回True,并用e返回该元素值,失败返回False LinkList p; int j=0; p=v; while(p-next&jnext;+j; if(j!=i) return False; else e=p-data; return True; void LPrint(LinkList v) /显示链表所有元素 LinkList q; q=v-next; printf(链表所有元素:); whi
23、le(q!=NULL) printf(%c ,q-data);q=q-next; printf(n);void LUnion(LinkList &u,LinkList &v,LinkList &w,int n) int i; LinkList p; w=(LinkList)malloc(LEN); /生成头结点 w-next=NULL; for(i=n;i0;-i) p=(LinkList)malloc(LEN); /生成新结点 if(u!=NULL) p-data=u-data ; u=u-next; else p-data=v-data ; v=v-next; p-next=w-next;
24、 w-next=p; 六、测试结果及说明顺序表和链表基本操作的实现程序编译结果没错误和提醒,运行测试结果正确,没有出现错误;1、顺序表2、链表七、实验体会1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。2.注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。3.单链表的结点结构除数据域外,还含有一个指针域。线性表提升实验(一)、实现顺序表元素的就地逆置一、设计方案 采用的数据结构本程序采用的数据逻辑结构为线性结构,存储结构为顺序结构,算法的总体功能是实现顺序表中元素的逆置。
25、 设计的主要思路由用户确定初始顺序表的长度并输入初始顺序表的元素,然后通过交换元素的方法将初始表中的元素进行逆置处理、输出元素。 算法描述status Initlist_Sq(Sqlist *L) /对顺序表A进行初始化void input(Sqlist *A) /对一个线性表输入数据,是先输入长度,然后再输入数据void print(Sqlist *A) /对一个线性表进行输出 void invert(Sqlist *A) /实现一个顺序表的逆置二、主要代码#include #include #include #define SIZE 100#define ListInc 10 #defin
26、e OK 1 typedef struct int *elem; int length; int listsize; Sqlist; typedef int status; status Initlist_Sq(Sqlist *L) L-elem =(int *)malloc(SIZE*sizeof(status); if(!L-elem) printf(voerflow); else L-length=0; L-listsize=SIZE; return OK; /对一个线性表输入数据,是先输入长度,然后再输入数据void input(Sqlist *A) int i=0; printf(本程序用于实现顺序表的逆置。n); printf(n请输入长度:n); scanf(%d,&A-length); printf(请输入数:n); for(i=0;ilength;i+) scanf(%d,&A-elemi); /对一个线性表进行输出 void print(Sqlist *A) int i; for(i=0;ilength;i+) printf(%dt,A-elemi); printf(nn); void invert(Sqlist *A) int n=A-length
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1