数据结构实验指导书源代码Word下载.docx
《数据结构实验指导书源代码Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书源代码Word下载.docx(67页珍藏版)》请在冰豆网上搜索。
![数据结构实验指导书源代码Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/13/7f622916-4ada-4092-b5a1-4ba15293739f/7f622916-4ada-4092-b5a1-4ba15293739f1.gif)
structlink
{elemtypedata;
//元素类型
link*next;
//指针类型,存放下一个元素地址
};
//头插法建立带头结点的单链表
link*hcreat()
{links,p;
elemtypei;
cout<
<
”输入多个结点数值(用空格分隔),为0时算法结束”;
cin>
>
i;
p=newlink;
p->
next=NULL;
while(i)//当输入的数据不为0时,循环建单链表
{s=newlink;
s->
data=i;
next=p->
next;
next=s;
cin>
}
returnp;
}
//输出单链表
voidprint(1ink*head)
{
1ink*p;
p=head->
while(p->
next!
=NULL)
{
cout<
p->
data<
”->
”;
//输出表中非最后一个元素
p=p->
data;
//输出表中最后一个元素
endl;
∥在单链表head中查找值为x的结点
Link*Locate(1ink*head,elemtypex)
Link*p;
while((p!
=NULL)&
&
(p->
data!
=x))
p=p->
//在head为头指针的单链表中,删除值为x的结点
voiddeletel(1ink*head,elemtypex)
1ink*p,*q;
q=head;
q=p;
If(p==NULL)cout<
“要删除的结点不存在”;
else
q->
next=p->
delete(p);
//在头指针head所指的单链表中,在值为x的结点之后插入值为y的结点
voidinsert(1ink*head,elemtypex,elemtypey)
{link*p,*s;
s=newlink;
data=y;
if(head->
next==NULL)//链表为空
head->
s->
next=NULL:
p=Locate(head,x);
//调用查找算法‘
if(p==NULL)
”插入位置非法”:
(s->
//将单链表p中所有值为x的元素修改成y
voidchange(1ink*p,elemtypex,elemtypey)
link*q;
q=p->
while(q!
{if(q->
data==x)q->
q=q->
voidcount(1ink*h)//统计单链表中结点个数
1ink*p;
intn=0;
p=h->
while(p!
{n++;
returnn;
voidmain()
{intn;
elemtypex,y;
link*p,*q;
p=hcreat();
//头插法建立链表
print(p);
//输出刚建立的单链表
”请输入要删除的元素”;
y;
deletel(p,y);
//输出删除后的结果
”请输入插入位置的元素值(将待插元素插入到它的后面)”;
x;
”请输入待插元素值”;
insert(p,x,y);
//输出插入后的结果
”请输入要修改前、后的元素值”;
x>
change(p,x,y);
”请输入要查找的元素值”;
q=Locate(p,x);
if(q==NULL)cout<
x<
”不在表中,找不到!
”<
elsecout<
”在表中,已找到!
n=count(p);
”链表中结点个数为:
n<
endl:
//单链表的建立(尾插法)、插入、删除、查找、修改、计数、输出
#include<
#defineelemtypeint
//指针类型,存放下-个元素地址
};
//尾插法建立带头结点的单链表
link*rcreat()
{link*s,*p,*r;
elemtypei;
i;
p=r=newlink;
while(i)
r->
r=s;
returnp;
{link*p;
"
->
”;
)
link*Locate(1ink*head,intx)∥在单链表中查找第x个结点
{link*p;
p=head;
intj=0;
(j<
x))
{p=p->
next;
j++;
voiddeleteI(1ink*head,elemtypex)
link*p,*q;
)
if(p==NULL)cout<
”要删除的结点不存在“;
else
}}
voidinsert(1ink*head,intx,elemtypey)
//在头指针head所指单链表中,在第x个结点之后插入值为y的结点
{link*p,*s;
next==NULL)//链表为空
head->
//调用查找算法
if(p==NULL)
”插入位置非法”;
{s->
}}
voidchange(1ink*p,elemtypex,elemtypey)
{∥将单链表P中所有值为x的元素改成值为y
q=p->
while(q!
{if(q->
data==x)q->
(1ink*p;
retumn;
{intn;
linkp,q;
p=rcreat();
//尾插法建立链表
print(p);
deletel(p,y);
”请输入插入位置”;
insert(p,x,y);
”请输入修改前、后的元素值”;
change(p,x,y);
“请输入要查找的元素值”;
q=Locate(p,x);
if(q==NULL)cout<
”不在表中,找不到!
elsecout<
n=count(p);
endl;
六、选作实验
试设计一元多项式相加(链式存储)的加法运算。
A(X)=7+3X+9X8+5X9
B(X)=8X+22X7-9X8
1.建立一元多项式;
2.输出相应的一元多项式;
3.相加操作的实现。
实验二循环链表的操作
通过本实验中循环链表和双向链表的使用,使学生进一步熟练掌握链表的操作方式。
本次实验可以从以下两个实验中任选一个:
1.建立一个单循环链表并实现单循环链表上的逆置。
所谓链表的逆置运算(或称为逆转运算)是指在不增加新结点的前提下,依次改变数据元素的逻辑关系,使得线性表(al,a2,a3,…,an)成为(an,…,a3,a2,a1)。
2.构建一个双向链表,实现插入、查找和删除操作。
①建立一个带头结点的单循环链表,从