合工大宣城校区数据结构实验报告单链表精编版

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

……………………………………………………………最新资料推荐…………………………………………………

数据结构实验报告

实验二单链表实验

1.实验目标

①熟练掌握线性表的链式存储结构。

②熟练掌握单链表的有关算法设计。

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

2.实验内容和要求

Ⅰ.实验要求

①本次实验中的链表结构指带头结点的单链表

②单链表结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;比如存储、算法实现放入文件:linkedList.h

③实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

④程序有适当的注释。

Ⅱ.实验内容

<1>尾插法创建单链表,打印创建结果。

1

……………………………………………………………最新资料推荐…………………………………………………

<2>头插法创建单链表,打印创建结果。

<3>销毁单链表。

<4>求链表长度。

<5>求单链表中第i个元素(函数),若不存在,报错。

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

<7>链表中查找元素值为x的结点,成功返回结点指针,失败报错

<8>删除单链表中第i个元素结点

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

<10>将单链表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的单链表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果

<11>求两个递增有序单链表L1和L2中的公共元素,放入新的单链表L3中

<12>删除递增有序单链表中的重复元素,要求时间性能最好

<13>递增有序单链表L1、L2,不申请新结点,利用原表结点对2表进行合并,并使得合并后成为一个集合,合并后用L1的头结点作为头结点,删除L2的头结点,要求时间性能最好

扩展实验:

<1>(递增有序)单链表表示集合A、B,实现:

C=A?B,C=A?B,C=A-B

A=A?B,A=A?B,A=A-B

2

……………………………………………………………最新资料推荐…………………………………………………

<2>(递增有序)单链表表示集合A、B,判定A是否B的子集

<3>已知一个带有表头结点的单链表,结点结构如下图。假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data 值,并返回1;否则,只返回0。

L/2??<4>(2011)(15 分)一个长度为L(L≥1)的升序序列S,处在第个位置的数称为S 的中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1 的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2, 4, 6, 8, 20),则S1 和S2 的中位数是11。

现有两个等长升序序列A 和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A 和B 的中位数

3.数据结构设计

struct Node

{

int value;

Node *next;

Node(int value = 0, Node *pNext = 0)

{

this->value = value;

this->next = pNext;

}

};

class linkedList

{

public :

linkedList();//构造函数

~linkedList();//<3>析构函数,销毁单链表

int length();//<4>求链表长度

3

……………………………………………………………最新资料推荐…………………………………………………

Node *listLocateI(int i);//<5>求单链表中第i个元素

bool listInsert(int i,int x);//<6>在第i个结点前插入值为x的结点 Node *listLocateX(int x);//<7>链表中查找元素值为x的结点,成功返回结点指针,失败报错。

bool listDelete(int i);//<8>删除单链表中第i个元素结点

Node *head;

};

4.算法设计

<1>~<8>为书中已经给出的基本算法,

<9>.定义一个指针p指向头结点,当p->next != NULL,循环比较p->next->value 与x的值之间的大小,若p->next->value

p->next,当申请新结点,存储x,将新结点插入在p之后,完成插入。

<10>.定义两个链表L1,L2,定义指针*p,*u,*r,分别指向L的首元素结点,L1,L2的头结点上,循环判断,如果p->value%2!=0,就插入到表L1中,否则,就插入到表L2中,然后令p=p->next,直至p!=NULL结束循环,输出L1,L2,其中L1表示奇结点,L2表示偶结点

<11>.定义两个链表L3,定义指针*p,*u,*r,分别指向L3的头结点,L1,L2

的首元素结点上,循环判断,如果u->value==r->value,就把该值插入到表L3中,如果u->value>r->value,让r=r->next,否则让u=u->next;当u==NULL

或者r==NULL,结束循环,输出L3;

<12>.将元素分为两部分,一部分是已经处理元素,和待处理元素。用r指向最后一个已经处理元素,用u指向还未处理的元素,如果u->value <

4

……………………………………………………………最新资料推荐…………………………………………………

r->value,就让u->next=r,删除中间的重复元素,否则就令r=r->next,当

r==NULL结束循环,令u->next=NULL,输出L

<13>.定义指针*p1,*p2,*u;p1,p2分别指向L1的头结点和L2的首元素结点,

判断p1->next->value与p2->value大小,前者大,则将p2插入到p1后面,后者大则让p1=p1->next,相等则p2=p2->next,p1=p1->next,当p1->next

==NULL或p2==NULL结束循环。若p2 !=NULL,直接将其接到p1之后,删除L2.head,输出L1.

扩展实验:

<1>. 对于采用集合C的运算,将符合要求的元素插入到新链表C中,对于不采用链表C的运算,就对链表A中元素进行插入与删除操作。

<2>.使用两个指针*u,*r,分别指向A,B的首元素结点,对A中元素按顺序进行判断,如果出现u->valuevalue,则表示A不为B的子集,如果

相关文档
最新文档