链表实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告
姓名;方钢学号:20105567 专业:电子商务班级:10-1班
指导教师:实验时间:实验地点:新区实验楼4楼
(实验题目)单链表实验
1.实验内容和要求
1.1实验要求
①本次实验中的链表结构均为带头结点的单链表;
②链表结构定义,算法实现放入库文件“linkList.h”;
运算和变量命名直观易懂,并有相应的注释
1.2实验内容
<1>求链表中第i个结点的指针(函数),若不存在,则返回NULL。

<2>在第i个结点前插入值为x的结点。

<3>删除链表中第i个元素结点。

<4>在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。

<5>将单链表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),申请
2个头结点,把分开的奇数项和偶数项分别链接到这2个头结点上,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

<6>求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。

2.实验目的
2.1 理解线性表的链式存储结构。

2.2熟练掌握单链表结构及有关算法的设计。

2.3根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

3.数据结构设计
<1>求链表中第i个结点的指针(函数),若不存在,则返回NULL。

实验代码
node *L,*p;
int i;
createNode(*&L); //尾插法创建一个链表,
cout<<"链表包含:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
cout<<"请输入待求元素序号:";
cin>>i;
locateNode (L, i, &p );
if(p!=NULL)
cout<<"序号"<<i<<"的元素值为:"<<p->data<<endl;
else
cout<<"NULL"<<endl;
destroyList(L); //销毁链表,释放heap内存
_CrtDumpMemoryLeaks(); //debug 模式下检测是否内存泄漏测试截图
<2>在第i个结点前插入值为x的结点。

实验代码
node *L,*p;
int i;
elementType x;
createNode(L); //尾插法创建一个链表,
cout<<"插入前链表包含:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
cout<<"插入前表长度len="<<listLength(L)<<endl; //调用长度函数
cout<<"请输入待插入的元素(x):";
cin>>x;
cout<<"请输入插入位置(i):";
cin>>i;
//调用插入函数,并检查是否插入成功
if(insertNode (L,i,x))
cout<<"元素 " << x <<" 成功插入表第 " << i << " 个节点位置!"<<endl;
else
cout<<"抱歉!元素插入失败!"<<endl;
//打印插入元素后的链表
cout<<"插入操作后链表元素:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
cout<<"插入后表长度len="<<listLength(L)<<endl;
destroyList(L); //销毁链表,释放heap内存
_CrtDumpMemoryLeaks(); //debug 模式下检测是否内存泄漏测试截图
<3>删除链表中第i个元素结点。

实验代码
node *L,*p;
int i;
elementType x;
creatNode(L); //尾插法创建一个链表,
cout<<"链表包含:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
cout<<endl;
cout<<"请输入待删除元素位置(i):";
cin>>i;
//调用删除函数,并检查是否删除成功
if(deleteNode (L,i))
cout<<"删除链表第 "<<i<<" 个节点成功!"<<endl;
else
cout<<"删除元素失败!"<<endl;
//删除节点后的链表
cout<<endl;
cout<<"删除节点后的链表元素:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
destroyList(L); //销毁链表,释放heap内存
_CrtDumpMemoryLeaks(); //debug 模式下检测是否内存泄漏测试截图
<4>在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。

实验代码
node *L,*p;
elementType x;
createNode(L); //尾插法创建一个链表,
cout<<"插入前链表包含:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<","; //递增有序表
p=p->next;
}
cout<<endl;
cout<<"插入前表长度len="<<listLength(L)<<endl; //调用长度函数
cout<<"请输入待插入的元素(x):";
cin>>x;
rankInsert (L,x);
cout<<"插入操作后链表元素:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
destroyList(L); //销毁链表,释放heap内存
_CrtDumpMemoryLeaks(); //debug 模式下检测是否内存泄漏
测试截图
<5>将单链表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),申请2
个头结点,把分开的奇数项和偶数项分别链接到这2个头结点上,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

实验代码
node *L,*p,*A,*B,*k,*m;
createNode(L); //尾插法创建一个链表,
cout<<"插入前链表包含:"<<endl;
p=L->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
cout<<"插入前表长度len="<<listLength(L)<<endl; //调用长度函数seperateNode (L,A,B);
cout<<"偶数表:"<<endl;
k=A->next;
while(k)
{
cout<<k->data<<",";
k=k->next;
}
cout<<endl;
cout<<"奇数表:"<<endl;
m=B->next;
while(m)
{
cout<<m->data<<",";
m=m->next;
}
cout<<endl;
destroyList(L); //销毁链表,释放heap内存
_CrtDumpMemoryLeaks(); //debug 模式下检测是否内存泄漏
测试截图
<6>求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。

实验代码
node *L,*A,*B,*p,*q,*r;
createNode(A);
createNode(B);
int t;
cout<<"A表元素:"<<endl;
p=A->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
cout<<"B表元素:"<<endl;
q=B->next;
while(q)
{
cout<<q->data<<",";
q=q->next;
}
cout<<endl;
t=getPENode (A,B,L);
switch(t)
{
case 0:
cout<<"无公共元素"<<endl;
break;
case 1:
cout<<"公共元素:"<<endl;
}
r=L->next;
while(r)
{
cout<<r->data<<",";
r=r->next;
}
cout<<endl;
destroyList(L); //销毁链表,释放heap内存
_CrtDumpMemoryLeaks(); //debug 模式下检测是否内存泄漏测试截图
4总结和心得
1>通过对链表上机实验的操作更加了解了可以用链来实现使用计算机零碎内存,并且知道了对使用过的内存使用destoryList来销毁内存的重要性;
2>整合各函数时遇到了线性表一样的问题,解决方法亦类似;
3>尾插法创建链表时,使用了直接用元素个数控制的方法,直接用p=p->next避免了连接链表指针的繁琐过程。

相关文档
最新文档