实验一 线性表.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->datadata)
{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