线性表的链式存储结构实验报告.docx
《线性表的链式存储结构实验报告.docx》由会员分享,可在线阅读,更多相关《线性表的链式存储结构实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
线性表的链式存储结构实验报告
实验报告
课程名称:
数据结构与算法分析
实验名称:
链表的实现与应用
实验日期:
2015.01.30班级:
数媒1401姓名:
范业嘉学号1030514108
一、实验目的
掌握线性表的链式存储结构设计与基本操作的实现。
二、实验内容与要求
⑴定义线性表的链式存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:
①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用
线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
⑸设计一个一元多项式计算器,要求能够:
①输入并建立多项式;②输出多项式;③执行两个多项式相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。
三、数据结构设计
1.按所用指针的类型、个数、方法等的不同,又可分为:
线性链表(单链表)
静态链表
循环链表
双向链表
双向循环链表
2.用一组任意的存储单元存储线性表中数据元素,用指针来表示数据元素间的逻辑关系。
四、算法设计
1.定义一个链表
voidcreatlist(Linklist&L,intn)
{
inti;
Linklistp,s;
L=(Linklist)malloc(sizeof(Lnode));
p=L;
L->next=NULL;
for(i=0;i{s=(Linklist)malloc(sizeof(Lnode));scanf("%d",&s->data);s->next=NULL;p->next=s;p=s;}}2.(1)两个链表的合并voidMergelist(Linklist&La,Linklist&Lb,Linklist&Lc){Linklistpa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;free(Lb);}(2)两个链表的并集Linklistunionlist(Linklist&La,Linklist&Lb){Linklistp1,p2,head,q,s;intflag;head=q=(Linklist)malloc(sizeof(Lnode));p1=La->next;while(p1){flag=0;p2=Lb->next;while(p2){if(p1->data==p2->data){flag=1;break;}p2=p2->next;}if(flag==0){s=(Linklist)malloc(sizeof(Lnode));s->data=p1->data;q->next=s;q=s;}p1=p1->next;}q->next=Lb->next;returnhead;}3.(1)一元多项式的加法Listaddpoly(Listpa,Listpb)//一元多项式的加法{intn;Listpc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(structLinklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){if(pa->expn>pb->expn){s=(List)malloc(sizeof(structLinklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}elseif(pa->expnexpn){s=(List)malloc(sizeof(structLinklist));s->expn=pb->expn;s->coef=pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}else{n=pa->coef+pb->coef;if(n!=0){s=(List)malloc(sizeof(structLinklist));s->expn=pa->expn;s->coef=n;s->next=NULL;p->next=s;p=s;}pb=pb->next;pa=pa->next;}}while(pa!=NULL){s=(List)malloc(sizeof(structLinklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}while(pb!=NULL){s=(List)malloc(sizeof(structLinklist));s->expn=pb->expn;s->coef=pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}returnpc;}(2)一元多项式的减法Listsubpoly(Listpa,Listpb)//一元多项式的减法{intn;Listpc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(structLinklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){if(pa->expn>pb->expn){s=(List)malloc(sizeof(structLinklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}elseif(pa->expnexpn){s=(List)malloc(sizeof(structLinklist));s->expn=pb->expn;s->coef=-pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}else{n=pa->coef-pb->coef;if(n!=0){s=(List)malloc(sizeof(structLinklist));s->expn=pa->expn;s->coef=n;s->next=NULL;p->next=s;p=s;}pb=pb->next;pa=pa->next;}}while(pa!=NULL){s=(List)malloc(sizeof(structLinklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}while(pb!=NULL){s=(List)malloc(sizeof(structLinklist));s->expn=pb->expn;s->coef=-pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}returnpc;}(3)一元多项式的乘法voidmulpolyn(polynomailpa,polynomailpb,polynomail&pc){LNode*p,*q,*s,*hc;p=pa->next;q=pb->next;hc=pc;while(p!=NULL){while(q!=NULL){s=(polynomail)malloc(sizeof(LNode));hc->next=s;hc=hc->next;hc->coef=q->coef*p->coef;hc->expn=q->expn+p->expn;q=q->next;}p=p->next;q=pb->next;}hc->next=NULL;}五、测试结果2.3.六、心得体会(包括对于本次实验的小结,实验过程中碰到的问题等)1.首先书上给的链表输入是倒序的,写的时候想都没想就抄上去了,结果运行时发现问题,可是上网XX依然没有把问题解决,导致最后输出链表倒序的,并且链表的合并并集依旧是倒序的。2.当写一元多项式的加减时,前提是弄清楚各种情况,系数相同时就相加减,系数不同就保留原有多项式;当系数相加减为0时,就free这个节点。在做减法时,我考虑到了减数与被减数之间的关系。3.在做多项式时,我准备按照书上的算法一个一个写小函数,结果到最后发现写不下去了,就去问问同学和上网看看,结果感觉写这个数据结构的程序其实不必想麻烦了,只是指针,数组的高级运用。
s=(Linklist)malloc(sizeof(Lnode));
scanf("%d",&s->data);
s->next=NULL;
p->next=s;p=s;
}
2.
(1)两个链表的合并
voidMergelist(Linklist&La,Linklist&Lb,Linklist&Lc)
Linklistpa,pb,pc;
pa=La->next;pb=Lb->next;
Lc=pc=La;
while(pa&&pb)
if(pa->data<=pb->data)
{pc->next=pa;pc=pa;pa=pa->next;}
else{pc->next=pb;pc=pb;pb=pb->next;}
pc->next=pa?
pa:
pb;
free(Lb);
(2)两个链表的并集
Linklistunionlist(Linklist&La,Linklist&Lb)
Linklistp1,p2,head,q,s;
intflag;
head=q=(Linklist)malloc(sizeof(Lnode));
p1=La->next;
while(p1)
flag=0;
p2=Lb->next;
while(p2)
if(p1->data==p2->data)
flag=1;
break;
p2=p2->next;
if(flag==0)
s->data=p1->data;
q->next=s;
q=s;
p1=p1->next;
q->next=Lb->next;
returnhead;
3.
(1)一元多项式的加法
Listaddpoly(Listpa,Listpb)//一元多项式的加法
intn;
Listpc,s,p;
pa=pa->next;
pb=pb->next;
pc=(List)malloc(sizeof(structLinklist));
pc->next=NULL;
p=pc;
while(pa!
=NULL&&pb!
=NULL)
if(pa->expn>pb->expn)
s=(List)malloc(sizeof(structLinklist));
s->expn=pa->expn;
s->coef=pa->coef;
p->next=s;
p=s;
elseif(pa->expnexpn)
s->expn=pb->expn;
s->coef=pb->coef;
else
n=pa->coef+pb->coef;
if(n!
=0)
s->coef=n;
while(pb!
returnpc;
(2)一元多项式的减法
Listsubpoly(Listpa,Listpb)//一元多项式的减法
s->coef=-pb->coef;
n=pa->coef-pb->coef;
(3)一元多项式的乘法
voidmulpolyn(polynomailpa,polynomailpb,polynomail&pc)
LNode*p,*q,*s,*hc;
p=pa->next;
q=pb->next;
hc=pc;
while(p!
while(q!
s=(polynomail)malloc(sizeof(LNode));
hc->next=s;
hc=hc->next;
hc->coef=q->coef*p->coef;
hc->expn=q->expn+p->expn;
q=q->next;
p=p->next;
hc->next=NULL;
五、测试结果
六、心得体会(包括对于本次实验的小结,实验过程中碰到的问题等)
1.首先书上给的链表输入是倒序的,写的时候想都没想就抄上去了,结果运行时发现问题,可是上网XX依然没有把问题解决,导致最后输出链表倒序的,并且链表的合并并集依旧是倒序的。
2.当写一元多项式的加减时,前提是弄清楚各种情况,系数相同时就相加减,系数不同就保留原有多项式;当系数相加减为0时,就free这个节点。
在做减法时,我考虑到了减数与被减数之间的关系。
3.在做多项式时,我准备按照书上的算法一个一个写小函数,结果到最后发现写不下去了,就去问问同学和上网看看,结果感觉写这个数据结构的程序其实不必想麻烦了,只是指针,数组的高级运用。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1