数据结构实验报告4.docx
- 文档编号:3710530
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:13
- 大小:141.08KB
数据结构实验报告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->zi { 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.按照要求输入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告