数据结构实验报告4.docx
《数据结构实验报告4.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告4.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实验报告4
数据结构实验报告——实验4
学号:
姓名:
得分:
______________
一、实验目的
1、复习线性表的逻辑结构、存储结构及基本操作;
2、掌握顺序表和(带头结点)单链表;
3、了解有序表。
二、实验内容
1、(必做题)假设有序表中数据元素类型是整型,请采用顺序表或(带头结点)单链表实现:
(1)OrderInsert(&L,e,int(*compare)(a,b))
//根据有序判定函数compare,在有序表L的适当位置插入元素e;
(2)OrderInput(&L,int(*compare)(a,b))
//根据有序判定函数compare,并利用有序插入函数OrderInsert,构造有序表L;
(3)OrderMerge(&La,&Lb,&Lc,int(*compare)())
//根据有序判定函数compare,将两个有序表La和Lb归并为一个有序表Lc。
2、(必做题)请实现:
(1)升幂多项式的构造,升幂多项式是指多项式的各项按指数升序有序,约定系数不能等于0,指数不能小于0;
(2)两个升幂多项式的相加。
三、算法描述
(采用自然语言描述)
1.
创建带头节点的链表,
输入两个有序表数据LaLb
归并两个有序表得有序表Lc
输出三个有序表
输入需插入数据e
将e插入有序表Lc
输出插入e后的Lc
2.
创建链表
按指数升序输入多项式得序数和指数
输出多项式
按指数升序输入第二个多项式得序数和指数
两个多项式相加
输出第二个多项式和两个多项式得和
四、详细设计
(画出程序流程图)
1.
2.
五、程序代码
(给出必要注释)
1.
#include
#include
typedefstructLNode
{
intdate;
structLNode*next;
}LNode,*Link;
typedefstructLinkList
{
Linkhead;//头结点
intlenth;//链表中数据元素的个数
}LinkList;
intcompare(LinkList*L,inte)//有序判定函数compare
{
intLc=0;
Linkp;
p=L->head;
p=p->next;
while(p!
=NULL)
{
if(e>p->date)
{
p=p->next;
Lc++;
}
else
returnLc;
}
returnLc;
}
voidOrderInsert(LinkList*L,inte,int(*compare)())//根据有序判定函数compare,在有序表L的适当位置插入元素e;
{
Linktemp,p,q;
intLc,i;
temp=(Link)malloc(sizeof(LNode));
temp->date=e;
p=q=L->head;
p=p->next;
Lc=(*compare)(L,e);
if(Lc==L->lenth)
{
while(q->next!
=NULL)
{
q=q->next;
}
q->next=temp;
temp->next=NULL;
}
else
{
for(i=0;i{
p=p->next;
q=q->next;
}
q->next=temp;
temp->next=p;
}
++L->lenth;
}
voidOrderMerge(LinkList*La,LinkList*Lb,int(*compare)())//根据有序判定函数compare,将两个有序表La和Lb归并为一个有序表
{
inti,Lc=0;
Linktemp,p,q;
q=La->head->next;
while(q!
=NULL)
{
p=Lb->head;
temp=(Link)malloc(sizeof(LNode));
temp->date=q->date;
Lc=(*compare)(Lb,q->date);
if(Lc==Lb->lenth)
{
while(p->next!
=NULL)
{
p=p->next;
}
p->next=temp;
temp->next=NULL;
}
else
{
for(i=0;i{
p=p->next;
}
temp->next=p->next;
p->next=temp;
}
q=q->next;
++Lb->lenth;
}
}
LinkList*Initialize(LinkList*NewList)
{
inti;
Linktemp;
NewList=(LinkList*)malloc((2+1)*sizeof(LinkList));
for(i=0;i<2+1;i++)
{
temp=(Link)malloc(sizeof(LNode));
temp->date=0;
temp->next=NULL;
(NewList+i)->head=temp;
(NewList+i)->lenth=0;
}
returnNewList;
}
voidInsert(LinkList*NewList)
{
inta,i;
charc;
printf("在第1个表中插入数据,输入“N”再对下个表插入数据\n");
for(i=0;i<2;i++)
{
while
(1)
{
scanf("%d",&a);
c=getchar();
if(c=='N')
{
if(i<2-2)
printf("在第%d个表中插入数据,输入“N”再对下个表插入数据\n",i+2);
elseif(i==2-2)
printf("在第%d个表中插入数据,输入“N”结束。
\n",i+2);
break;
}
else
{
OrderInsert((NewList+i),a,compare);
}
}
}
}
voidShow(LinkList*L)//输出有序表
{
Linkp;
p=L->head->next;
while(p!
=NULL)
{
printf("%d",p->date);
p=p->next;
}
}
voidvisit(LinkList*NewList,void(*Show)())
{
printf("有序表如下:
\n");
printf("第一个有序表为:
\n");
(*Show)(NewList+0);
printf("\n");
printf("第二个有序表为:
\n");
(*Show)(NewList+1);
printf("\n");
printf("归并后有序表为:
\n");
(*Show)(NewList+2);
printf("\n");
}
intmain()
{
LinkList*NewList=NULL;
LinkList*L;
inti,e;
printf("请按要求输入数据\n");
NewList=Initialize(NewList);
Insert(NewList);
for(i=0;i<2;i++)
{
OrderMerge(NewList+i,NewList+2,compare);
}
visit(NewList,Show);
L=NewList;
printf("\n请输入将要插入的e:
\n");
scanf("%d",&e);
OrderInsert((NewList+i),e,compare);
printf("对归并后有序表插入e后得\n");
Show(NewList+2);
return0;
}
2.
#include
#include
typedefstructnode
{
intxi;
intzi;
structnode*next;
}Node;
Node*Creat()//用链表储存多项式的序数与指数
{
Node*head,*p,*q;
intor,in;
head=(Node*)malloc(sizeof(Node));
head->next=NULL;
q=head;
printf("请输入多项式的序数与指数\n(注意:
按照指数升序输入,系数不能等于0且指数不能小于0,序数与指数用空格隔开,并以00结束输入)\n");
scanf("%d%d",&or,&in);
while(or)
{
p=(Node*)malloc(sizeof(Node));
p->xi=or;
p->zi=in;
p->next=q->next;
q->next=p;
q=p;
scanf("%d%d",&or,&in);
}
returnhead;
}
voidvisit(Node*head)//输出多项式
{
Node*p=head->next;
while(p)
{
printf("%dX^%d+",p->xi,p->zi);
p=p->next;
}
printf("NULL\n\n");
}
Node*Add(Node*head1,Node*head2)//多项式相加
{
Node*p,*head,*p1,*p2;
intsum;
head=(Node*)malloc(sizeof(Node));
p=head;
p1=head1->next;
p2=head2->next;
while(p1&&p2)//当两多项式都存在时
{
if(p1->zi==p2->zi)//如果指数相等
{
sum=p1->xi+p2->xi;
if(sum)
{
p1->xi=sum;
p->next=p1;
p=p1;
}
p1=p1->next;
p2=p2->next;
}
else//指数不相等分两种情况
{
if(p1->zizi)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
}
if(p1)p->next=p1;//将1中剩余结点接到和链表中因为最终只剩下一段链表多项式
elsep->next=p2;//将2中剩余结点接到和链表中这段链的链头接到目标链表就可以了
returnhead;
}
intmain()
{
printf("请输入第一个多项式\n");
Node*head,*p1,*p2;
p1=Creat();
printf("多项式为:
\n");
visit(p1);
printf("请输入第二个多项式\n");
p2=Creat();
printf("多项式为:
\n");
visit(p2);
head=Add(p1,p2);
printf("\n多项式相加后得:
\n");
visit(head);
return0;
}
六、测试和结果
(给出测试用例,并给出测试结果)
1.
2.
七、用户手册
(告诉用户如何使用程序,使用注意事项等)
1.按照要求输入