线性链表的的应用.docx

上传人:b****7 文档编号:9170392 上传时间:2023-02-03 格式:DOCX 页数:15 大小:33.98KB
下载 相关 举报
线性链表的的应用.docx_第1页
第1页 / 共15页
线性链表的的应用.docx_第2页
第2页 / 共15页
线性链表的的应用.docx_第3页
第3页 / 共15页
线性链表的的应用.docx_第4页
第4页 / 共15页
线性链表的的应用.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

线性链表的的应用.docx

《线性链表的的应用.docx》由会员分享,可在线阅读,更多相关《线性链表的的应用.docx(15页珍藏版)》请在冰豆网上搜索。

线性链表的的应用.docx

线性链表的的应用

计算机科学与工程学院

《数据结构》课程实验报告[二]

专业班级

计算机工程01

试验地点

419

学生学号

0905080130

指导教师

蔡琼

学生姓名

郑凯

试验时间

日期:

2011年4月1日第六周星期五节次78

试验名称

线性结构综合应用

(1)线性链表的的应用

试验类别

操作性()验证性()设计性()综合性(√)其它()

实验目的与要求

目的:

(1)熟练掌握链表结构及有关算法的设计;

(2)掌握用链表表示的特定形式的数据结构的方法,并能编写出有关运算的算法。

要求:

利用线性链表实现。

实验内容要点

一元多项式求和:

把任意给定的两个一元多项式P(X),Q(X)输入计算机,计算它们的和,并输出结果。

教师评语

 

教师签名

年月日

题目:

一元多项式求和

一.需求分析

本程序中,要求用户输入两个一元多项式,将其分别存入两个线性链表中,待计算机将其求和后,将最后结果存入另一个线性链表中,并输出结果。

根据需求,需构造线性链表存储结构,创建三个空链表,和三个函数,一个为求和函数,一个为输入函数,一个为输出函数。

求和函数中应包括一元多项式中各系数的的比较,相加排序等。

程序的执行过程包括以下几步:

书写头文件

构造线性链表

构造输入一元多项式的函数

构造输出函数

构造求和函数

书写主函数

结束

二.概要设计

为了实现上述操作,应以线性链表为存储结构。

1.基本操作:

typedefstructpolynode

{

intcoef;

intexp;

structpolynode*next;

}polynode,*PLinklist;

PLinklistCreate(intn)

{

PLinklistL,p;

inti;

L=(PLinklist)malloc(sizeof(polynode));

L->next=NULL;

for(i=n;i>0;--i)

{

p=(PLinklist)malloc(sizeof(polynode));

cout<<"请输入链表中第"<

cout<<"系数是";

cin>>p->coef;

cout<<"指数是";

cin>>p->exp;

p->next=L->next;

L->next=p;

}

return(L);

}

操作结果,构造线性链表,并为其赋值。

2.本程序包含三个模块:

(1)主程序模块;

(2)构造链表及其相关操作函数;

(3)PLinklistAttach,PLinklistAdd函数,输出题目要求的序列;

三、详细设计

⒈元素类型和存储结构

typedefstructpolynode

{

intcoef;

intexp;

structpolynode*next;

}polynode,*PLinklist;

PLinklistCreate(intn)

{

PLinklistL,p;

inti;

L=(PLinklist)malloc(sizeof(polynode));

L->next=NULL;

for(i=n;i>0;--i)

{

p=(PLinklist)malloc(sizeof(polynode));

cout<<"请输入链表中第"<

cout<<"系数是";

cin>>p->coef;

cout<<"指数是";

cin>>p->exp;

p->next=L->next;

L->next=p;

}

return(L);

}

⒉每个模块的分析

⑴主程序模块

voidmain()

{

intn,m,c;

PLinklistA,B,C;

cout<<"请输入链表A的长度n=";

cin>>n;

A=Create(n);

Print(A,n);

cout<<"请输入链表B的长度m=";

cin>>m;

B=Create(m);

Print(B,m);

C=Add(A,B);

c=m+n;

Print(C,c);

}

①定义变量:

链表A的长度n,

链表B的长度m.

②构造链表

③为链表中所有元素赋值

④调用求和函数PLinklistAttach,PLinklistAdd

⑤输出结果

⑵构造顺序表及其相关操作函数

在解决数据结构的问题时,首先要考虑数据元素之间的关系,数据元素有四类基本结构:

集合,线性结构,树形结构,图状结构或网状结构。

通过分析数据元素的逻辑关系来为数据元素选择一种合适的存储结构,有顺序存储结构和链式存储结构。

学了这门课程后,我们要有能够将问题给出的信息,转化成数据,分解出数据元素,再分析数据元素之间的关系。

多项式的每个单项式可用两个数据项(Pi,Ei)(系数项和指数项)的数据元素表示,若用一个长度为M且每个元素有两个数据项的线性表,便可唯一确定一个多项式。

因为要对两个多项式进行运算,所以采用链式存储表示。

数据元素就变成由三个数据项组成。

线形表的单链表存储结构为:

typedefstructpolynode/*类型名和函数名*/

{

intcoef;

intexp;

structpolynode*next;

}polynode,*PLinklist;

PLinklistCreate(intn)

{

PLinklistL,p;

inti;

L=(PLinklist)malloc(sizeof(polynode));/*申请空间*/

L->next=NULL;

for(i=n;i>0;--i)

{

p=(PLinklist)malloc(sizeof(polynode));/*申请空间*/

cout<<"请输入链表中第"<

cout<<"系数是";

cin>>p->coef;

cout<<"指数是";

cin>>p->exp;

p->next=L->next;

L->next=p;

}

return(L);

}

要对多项式进行操作,必须将表示多项式的数据元素输入到计算机里。

这就是建立链表的过程。

编写这个函数,须熟悉线形链表的“头指针”,“头结点”等概念和C语言中“动态分配存储空间”等。

建立链表的函数,可以用各种方式编写.

1定义链表存储结构,包括:

其元素,长度。

2构造链表

3将元素填入构造的链表中

⑶PLinklistAttach,PLinklistAdd函数,输出题目要求的序列

PLinklistAttach(intco,intex,PLinklisto)

{

PLinklistc;

c=(PLinklist)malloc(sizeof(polynode));

c->coef=co;

c->exp=ex;

o->next=c;

returnc;

}

voidPrint(PLinklistL,intn)

{

inti=0;

PLinklistp=L;

while(p->next!

=NULL)

{

cout<coef<<'\t'<exp<<'\t';

p=p->next;

}

}

PLinklistAdd(PLinklistA,PLinklistB)

{

PLinklistC;

PLinklisto;

PLinklistp=A;

PLinklistq=B;

intsum;

C=(PLinklist)malloc(sizeof(polynode));

o=C;

while((p!

=NULL)&&(q!

=NULL))

{

if(p->exp==q->exp)

{

sum=p->coef+q->coef;

if(sum!

=0)

o=Attach(sum,p->exp,o);

p=p->next;

q=q->next;

}

elseif(p->expexp)

{

o=Attach(q->coef,q->exp,o);

q=q->next;

}

else{

o=Attach(p->coef,p->exp,o);

p=p->next;

}

}

while(p!

=NULL)

{

o=Attach(p->coef,p->exp,o);

p=p->next;

}

while(q!

=NULL)

{

o=Attach(q->coef,q->exp,o);

q=q->next;

}

o->next=NULL;

p=C;

C=C->next;

returnC;

}

多项式相加

多项式相加就是对链表进行操作。

和多项式链表中的结点无需另生成,而应从两个链表中摘取。

从首元结点开始,要对两个链表的每个结点进行比较。

根据不同的结果,进行不同的操作。

主要有三种操作。

(假设qa与qb为指向两个链表中当前进行比较的某个结点。

1)p->expexp则应摘取p指针所指结点插入到和多项式链表中。

2)p->exp=q->exp两个指针所指结点的系数项相加

3)p->exp=p->exp则应摘取q指针所指结点插入到和多项式链表中。

这个函数用到了线性链表的插入算法,删除算法等。

执行后,和多项式链表就会生成。

⒊完整的程序源代码

#include

#include

#include

#include

typedefstructpolynode

{

intcoef;

intexp;

structpolynode*next;

}polynode,*PLinklist;

PLinklistCreate(intn)

{

PLinklistL,p;

inti;

L=(PLinklist)malloc(sizeof(polynode));

L->next=NULL;

for(i=n;i>0;--i)

{

p=(PLinklist)malloc(sizeof(polynode));

cout<<"请输入链表中第"<

cout<<"系数是";

cin>>p->coef;

cout<<"指数是";

cin>>p->exp;

p->next=L->next;

L->next=p;

}

return(L);

}

PLinklistAttach(intco,intex,PLinklisto)

{

PLinklistc;

c=(PLinklist)malloc(sizeof(polynode));

c->coef=co;

c->exp=ex;

o->next=c;

returnc;

}

voidPrint(PLinklistL,intn)

{

inti=0;

PLinklistp=L;

while(p->next!

=NULL)

{

cout<coef<<'\t'<exp<<'\t';

p=p->next;

}

}

PLinklistAdd(PLinklistA,PLinklistB)

{

PLinklistC;

PLinklisto;

PLinklistp=A;

PLinklistq=B;

intsum;

C=(PLinklist)malloc(sizeof(polynode));

o=C;

while((p!

=NULL)&&(q!

=NULL))

{

if(p->exp==q->exp)

{

sum=p->coef+q->coef;

if(sum!

=0)

o=Attach(sum,p->exp,o);

p=p->next;

q=q->next;

}

elseif(p->expexp)

{

o=Attach(q->coef,q->exp,o);

q=q->next;

}

else{

o=Attach(p->coef,p->exp,o);

p=p->next;

}

}

while(p!

=NULL)

{

o=Attach(p->coef,p->exp,o);

p=p->next;

}

while(q!

=NULL)

{

o=Attach(q->coef,q->exp,o);

q=q->next;

}

o->next=NULL;

p=C;

C=C->next;

returnC;

}

voidmain()

{

intn,m,c;

PLinklistA,B,C;

cout<<"请输入链表A的长度n=";

cin>>n;

A=Create(n);

Print(A,n);

cout<<"请输入链表B的长度m=";

cin>>m;

B=Create(m);

Print(B,m);

C=Add(A,B);

c=m+n;

Print(C,c);

}

四、调试结果及说明

⒈说明

⑴本程序的运行环境为VC6.0。

⑵进入演示程序后即显示提示信息:

⒉测试结果

五、实验总结

在将代码写完后,经调试,发现没有错误。

可是运行后发现结果是

不知道原因是什么,后来经同学修改后,得到运行结果,可是为什么出现这种情况,我还是不太清楚。

编程能力有待提高。

六、实验体会

C语言和C++是学习数据结构的基础,要在巩固下这两门课程。

对于一个编程员来说,算法与数据结构是很重要的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1