线性表的链式存储结构实验报告

  • 格式:doc
  • 大小:34.50 KB
  • 文档页数:7
pc->next=NULL;
p=pc;
while(pa!=NULL&&pb!=NULL)
{
if(pa->expn>pb->expn)
{
s=(List)malloc(sizeof(struct Linklist));
s->expn=pa->expn;
s->coef=pa->coef;
s->next=NULL;
Linklist p,s;
L=(Linklist)malloc(sizeof(Lnode));
p=L;
L->next=NULL;
for(i=0;i<n;i++)
{
s=(Linklist)malloc(sizeof(Lnode));
scanf("%d",&s->data);
s->next=NULL;
p->next=s; p=s;
{
Linklist p1,p2,head,q,s;
int flag;
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;
p->next=s;
p=s;
pb=pb->next;
}
return pc;
}
(2)一元多项式的减法
List subpoly(List pa,List pb) //一元多项式的减法
{
int n;
List pc,s,p;
pa=pa->next;
pb=pb->next;
pc=(List)malloc(sizeof(struct Linklist));
p->next=s;
p=s;
pa=pa->next;
}
else if(pa->expn<pb->expn)
{
s=(List)malloc(sizeof(struct Linklist));
s->expn=pb->expn;
s->coef=-pb->coef;
s->next=NULL;
p->next=s;
{
s=(List)malloc(sizeof(struct Linklist));
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(struct Linklist));
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;
return head;
}
3.(1)一元多项式的加法
p=s;
pb=pb->next;
}
else
{
n=pa->coef-pb->coef;
if(n!=0)
{
s=(List)malloc(sizeof(struct Linklist));
s->expn=pa->expn;
s->coef=n;
s->next=NULL;
p->next=s;
p=s;
}
pb=pb->next;
线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。
2.当写一元多项式的加减时,前提是弄清楚各种情况,系数相同时就相加减,系数不同就保留原有多项式;当系数相加减为0时,就free这个节点。在做减法时,我考虑到了减数与被减数之间的关系。
3.在做多项式时,我准备按照书上的算法一个一个写小函数,结果到最后发现写不下去了,就去问问同学和上网看看,结果感觉写这个数据结构的程序其实不必想麻烦了,只是指针,数组的高级运用。
{
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;
三、数据结构设计
1.按所用指针的类型、个数、方法等的不同,又可分为:
线性链表(单链表)
静态链表
循环链表
双向链表
双向循环链表
2.用一组任意的存储单元存储线性表中数据元素,用指针来表示数据元素间的逻辑关系。
四、算法设计
1.定义一个链表
void creatlist(Linklist &L,int n)
{
int i;
}
}
2.(1)两个链表的合并
void Mergelist(Linklist &La,Linklist &Lb,Linklist &Lc)
{
Linklist pa,pb,pc;
pa=La->next;pb=Lb->next;
Lc=pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
s=(List)malloc(sizeof(struct Linklist));
s->expn=pb->expn;
s->coef=-pb->coef;
s->next=NULL;
p->next=s;
p=s;
pb=pb->t;
}
return pc;
}
(3)一元多项式的乘法
void mulpolyn(polynomail pa,polynomail pb,polynomail &pc)
hc->expn=q->expn+p->expn;
q=q->next;
}
p=p->next;
q=pb->next;
}
hc->next=NULL;
}
5、
2.
3.
六、心得体会(包括对于本次实验的小结,实验过程中碰到的问题等)
1.首先书上给的链表输入是倒序的,写的时候想都没想的,并且链表的合并并集依旧是倒序的。
List addpoly(List pa,List pb) //一元多项式的加法
{
int n;
List pc,s,p;
pa=pa->next;
pb=pb->next;
pc=(List)malloc(sizeof(struct Linklist));
pc->next=NULL;
p=pc;
while(pa!=NULL&&pb!=NULL)
{
if(pa->expn>pb->expn)
{
s=(List)malloc(sizeof(struct Linklist));
s->expn=pa->expn;
s->coef=pa->coef;
s->next=NULL;
p->next=s;
p=s;
pa=pa->next;
}
else if(pa->expn<pb->expn)
{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)两个链表的并集
Linklist unionlist(Linklist &La,Linklist &Lb)
实验报告
课程名称
实验名称
实验日期
一、实验目的
掌握线性表的链式存储结构设计与基本操作的实现。
二、实验内容与要求
⑴定义线性表的链式存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用
pa=pa->next;