双链表及链表应用实验

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

循环链表、双链表及链表应用实验

实验报告

实验目的

(1)理解单循环链表及双循环链表的特点。

(2)掌握这两种结构的算法设计。

(3)运用链表存储数据并设计有关算法。

(4)理解头结点、头指针概念以及设置头结点的优点

实验运行环境

Visual C++

实验任务

为使实验程序简洁直观, 同样是将实验程序中将所需要的函数以调用库函数的形式给出, 并假设将库函数放在程序文件"linklist.h"中, 同时假设该库函数文件中定义了链表结构中的指针类型为link, 结点类型为node, 双链表中结点的类型为dunode, 其中有data、next和prior等字段, data的类型为int, 而next和prior分别为指示其下一个和前一个结点的指针, 类型为dulink(即dunode *)。类似地, 定义了部分常用运算, 如构建链表、显示链表等。各运算的名称较为直观, 并有相应的注释, 因而易于理解和实现。读者在上机实验时, 需要自己设计出所涉及到的库函数, 或者将函数放在实验程序中, 以方便实验程序的调试。

实验要求

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

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

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

4.在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。5.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以

便对照求解结果。

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

实验内容

第一题:

依次访问无头结点的单循环链表的各结点。

实验测试数据基本要求:

第一组数据:链表元素为(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60)

第二组数据:链表元素为(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

实验准备:

p=head; //因为没有首位,所以输入一点,令为首位

do{/*访问节点的语句*/;p=p->next;}

while(p!=head); //只让循环进行一次,避免进入死循环,所以用p!=head

//作为判断条件

第二题:

设计算法以判断一个带头结点的单循环链表是否满足这样的条件:其中每个结点的元素值与其序号的差的绝对值不大于3。若成立, 返回TRUE, 否则返回FALSE。

实验测试数据基本要求:

第一组数据:链表元素为

(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 18)第二组数据:链表元素为

(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 20, 18)

实验准备:

If((p->data-i<=3)&&( p->data-i>=-3))return TRUE;

//判断每个结点的元素值与其序号的差的绝对值是否不大于3

else return FALSE;

第三题:

利用递增有序的单循环链表表示集合, 分别求两个链表表示的集合的交、并集所构成的链表。

实验测试数据基本要求:

第一组

第一个链表元素为(1, 3, 6, 10, 15, 16, 17, 18, 19, 20)

第二个链表元素为(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 20, 30)

第二组

第一个链表元素为(1, 3, 6, 10, 15, 16, 17, 18, 19, 20)

第二个链表元素为(2, 4, 5, 7, 8, 9, 12, 22)

第三组

第一个链表元素为()

第二个链表元素为(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

实验准备:

C=x^y,node*px,*py; //建立一个表C 和指针px py

px->data==py->data;px=px->next;py=py->next;//如果px指向的数据

//等于py指向的数据,px 和px 就同时向后继续px->data>py->data;py=py->next;// 如果px指向的元素如果大于py,根据递增

//有序,则只需py向后搜索比当前py指向的数据大的

//数据来和当前px指向的数据判断是否相等px->datadata;px=px->next; // 如果px指向的元素如果小于py,根据递

//增有序,则只需px向后搜索比当前px指向的数据大

//的数据来和当前py指向的数据判断是否相等

x=xUy;

//取表x,将y与x元素做同样比较py->data!=px->data;将py->data插入x表;

第四题:

编写算法以构造带头结点的双循环链表。

实验测试数据基本要求:

第一组数据:链表元素为(1,2,3,4,5,6,7,8,9,10)

第二组数据:链表元素为(10,30,40,55,60,70,88,99,100)

实验准备:

struct dnode{elementtype data;dnode*prior,*next;};

//先建立空表head=new dnode;指针指向null;p指向当前节点;

//然后进行尾插入;p->next=s;s->prior=p;p=head;首尾相接;

第五题:

编写算法以判断一个带头结点的双循环链表是否是对称的, 若成立, 返回TRUE, 否则返回FALSE。

实验测试数据基本要求:

第一组数据:链表元素为(1, 2, 3, 4, 5, 4, 3, 2, 1)

第二组数据:链表元素为(1, 2, 3, 4, 5, 5, 4, 3, 2, 1)

第三组数据:链表元素为(1, 2, 3, 4, 5, 6, 3, 2, 1)

第四组数据:链表元素为(1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1)

实验准备:

{px=head->next;py=head->prior;//指针px指向后一数据,

//指针py指向头元素的前一数据

while(px!=py) //如果指针px和py指向的不是同一数

//以此来作为结束循环的条件

{

if(px->data!=py->data) //只要有任意px和py指向数据不相等,return false; //则该链表是不对称的

px=px->next;py=py->prior;} //只要任意px和py指向

//数据未出现不相等,则继续向后查找

return ture;

实验程序

#include

#include

struct Node

{

int data1;

相关文档
最新文档