实验一 线性表.docx
- 文档编号:11810323
- 上传时间:2023-04-02
- 格式:DOCX
- 页数:12
- 大小:36.31KB
实验一 线性表.docx
《实验一 线性表.docx》由会员分享,可在线阅读,更多相关《实验一 线性表.docx(12页珍藏版)》请在冰豆网上搜索。
实验一线性表
实验一线性表
实验项目名称
线性表
实验日期
实验室
9#405实验室
机号
4
实验类型
设计型
学时
2
一、实验目的及要求(本次上机实践所涉及并要求掌握的知识点)
1、掌握顺序表的存储结构形式及其描述和基本运算的实现。
2、掌握动态链表结构及相关算法设计。
3、正确设计和调试本实验程序并上机运行,记录程序运行结果,结合运行结果,对程序进行分析。
4、完成实验报告。
二、实验环境(本次上机实践所使用的平台和相关软件)
微型计算机
WindowsXP,Visualc++
三、实验内容及步骤
实验内容:
1、实现顺序表的创建(输入)、输出、查找、插入和删除功能。
2、单链表的查找、插入和删除等基本操作的实现。
3、利用基本操作,实现两个有序单链表的合并。
实验步骤:
1、实现顺序表的创建(输入)、输出、查找、插入和删除功能。
●顺序表类型定义和相关的常量定义。
●创建顺序表:
初始化顺序表。
●编写函数,为顺序表录入数据。
●编写顺序表输出函数,通过循环依次输出SqList中的各个元素的内容。
●编写函数实现查找、插入和删除等基本操作。
2、实现单链表设计以及各种基本操作的实现。
●单链表类型定义和相关的常量定义。
●创建单链表:
初始化单链表。
●编写函数,为单链表录入数据。
●编写单链表输出函数,通过循环依次输出单链表中的各个元素的内容。
●编写函数实现单链表的查找、插入和删除等基本操作。
3、实现两个有序单链表的合并。
算法分析和设计
①为使算法的时间复杂度为O(n+m)只能采用“平移指针,一次扫描”的方法,于是设两个指针分别指向两个线性表表头。
②为使合并后仍为一个有序表,需对指针所指结点的数据域进行比较。
③要使合并后的有序表为递减有序表,比较后选出较小的一个将其从原链表中取出插入到新表的表首。
④指针后移,重复②,③步,直到其中一个表结束,将尚未结束表的元素依次取出插入新表。
⑤为减少头指针的变化,采用带有头结点的链表。
算法如下:
structnode
{intdata;
structnode*link;
}
typedefstructnodeNODE;
NODE*merge_link(NODE*head_a,NODE*head_b)
{NODE*p,*q,*head;
head=(NODE*)malloc(sizeof(NODE));
head->link=NULL;
p=head_a->link;
q=head_b->link;
while((p!
=NULL)&&(q!
=NULL))
if(p->data
{head_a->link=p->link;
p->link=head->link;
head->link=p;
p=head_a->link;
}
else
{head_b->link=q->link;
q->link=head->link;
head->link=q;q=head_b->link;
}
while(p!
=NULL)
{head_a->link=p->link;
p->link=head->link;
head->link=p;
p=head_a->link;
}
while(q!
=NULL)
{head_b->link=q->link;
q->link=head->link;
head->link=q;
q=head_b->link;
}
free(head_a);
free(head_b);
return(head);
}
四、实验结果(本实验源程序清单及运行结果或实验结论、实验设计图)
实验程序1.#include
#defineok1
#defineerror0
#defineMAXSIZE100/*顺序表的容量*/
typedefintElemType;
typedefstruct
{
ElemTypeelem[MAXSIZE];/*存放顺序表的元素*/
intlast;/*顺序表的实际长度*/
}SqList;
voidInitList(SqList&sq)/*初始化线性表*/
{
sq.last=-1;
}
voidInputList(SqList&sq)/*输入线性表*/
{
inti=0,n=0;
printf("输入线性表的长度:
");
scanf("%d",&n);
printf("输入线性表元素:
");
while(i {scanf("%d",&sq.elem[i]); i++;} sq.last=n-1; printf("\n"); } voidDispList(SqListsq)/*输出线性表*/ { inti; printf("输出线性表元素: "); for(i=0;i<=sq.last;i++) printf("%d",sq.elem[i]); printf("\n"); } intLocate(SqListsq,ElemTypex)/*按值查找*/ { inti=0; while((i<=sq.last)&&(sq.elem[i]! =x))/*查找值为x的第1个结点*/ i++; if(i>sq.last) return(-1);/*未找到*/ else return(i+1); } intInsList(SqList&sq,ElemTypee,inti)/*插入*/ { intk; if((i<1)||(i>sq.last+2)) { printf("插入位置i值不合法"); returnerror; } if(sq.last>=MAXSIZE-1) { printf("表已满,无法插入"); returnerror; } for(k=sq.last;k>=i-1;k--) sq.elem[k+1]=sq.elem[k]; sq.elem[i-1]=e; sq.last++; returnok; } intDelList(SqList&sq,inti,ElemType*e)/*删除*/ { intk; if((i<1)||(i>sq.last)) { printf("删除位置不合法"); returnerror; } else { *e=sq.elem[i-1]; for(k=i;k<=sq.last;k++) sq.elem[k-1]=sq.elem[k]; sq.last--; returnok; } } voidmain() { SqListsq; ElemTypex,r; intm,n,q,t,w,e,v; InitList(sq);/*初始化顺序表sq*/ InputList(sq); DispList(sq); printf("输入待查找的元素: "); scanf("%d",&x); printf("输入待插入的元素: "); scanf("%d",&e); printf("输入待插入的位置: "); scanf("%d",&q); m=Locate(sq,x); if(m==-1) printf("线性表中没有元素%d! \n",x); else printf("%d是线性表的第%d个元素! \n",x,m); v=InsList(sq,e,q); if(v==ok) DispList(sq); else printf("待插入位置不合法: "); printf("输入待删除的位置: "); scanf("%d",&t); w=DelList(sq,t,&r); if(w==ok) { DispList(sq); printf("%d\n",r); } else printf("删除位置不合法"); } 运行结果: 实验程序.#include #include typedefcharElemType; typedefstructnode { ElemTypedata;/*数据域*/ structnode*next;/*指针域*/ }SLink; voidInitList(SLink*&L)/*L作为引用型参数*/ { L=(SLink*)malloc(sizeof(SLink));/*创建头结点*L*/ L->next=NULL; } voidDispList(SLink*L)/*输出单链表*/ { SLink*p=L->next; while(p! =NULL) { printf("%c",p->data); p=p->next; } printf("\n"); } voidCreateFromTail(SLink*&L)/*输入单链表,当输入$时结束*/ {SLink*r,*s; charc; intflag=1; r=L; while(flag) {c=getchar(); if(c! ='$') {s=(SLink*)malloc(sizeof(SLink)); s->data=c; r->next=s; r=s; } else {flag=0; r->next=NULL; } }/*while*/ }/*CreateFromTail*/ SLinkMergeLinkList(SLink*LA,SLink*LB) { SLink*pa,*pb; SLink*LC,*r; pa=LA->next; pb=LB->next; LC=LA; LC->next=NULL;r=LC; while(pa! =NULL&&pb! =NULL) { if(pa->data<=pb->data) {r->next=pa;r=pa;pa=pa->next; } else {r->next=pb;r=pb;pb=pb->next;} } if(pa) r->next=pa; else r->next=pb; free(LB); return(*LC); } voidmain() { SLink*LA,*LB; InitList(LA); InitList(LB);/*初始化单链表L*/ printf("输入单链表LA中的元素(字符型),$符号是结束标志! \n"); CreateFromTail(LA); printf("输入单链表LB中的元素(字符型),$符号是结束标志! \n"); CreateFromTail(LB); printf("线性表: "); DispList(LA); DispList(LB); MergeLinkList(LA,LB); DispList(LA); } 运行结果: 五、实验总结(对本实验结果进行分析,实验心得体会及改进意见) 通过本次的实验,我学习了顺序表的创建(输入)、输出、查找、插入和删除功能;单链表的查找、插入和删除等基本操作以及两个有序单链表的合并。 在实验过程中,通过这次的程序设计,发现一个程序设计就是算法与数据结构的结合体,自己也开始对程序产生了前所未有的兴趣,以前偷工减料的学习也不可能一下子写出一个程序出来,于是我就认真看老师写的程序,发现我们看懂了一个程序其实不难,难的是对于一个程序的思想的理解,我们要掌握一个算法,不仅仅限于读懂,主要的是要理解老师的思路,学习老师的解决问题的方法。 六、本次实验得分 95
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验一 线性表 实验 线性