数据结构实验指导书(1) 联系客服

发布时间 : 星期四 文章数据结构实验指导书(1)更新完毕开始阅读

数据结构试验指导书

实验02 单链表的基本操作

实验学时:2学时 实验类型:上机

背景知识:单链表的插入、删除及应用。

目的要求:

1.掌握单链表的存储特点及其实现。

2.掌握单链表的插入、删除算法及其应用算法的程序实现。

实验内容:

编写一个完整的程序,实现单链表的生成、插入、删除、输出等基本操作。

(1) 随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。 (2) 计算单链表的长度,遍历单链表。

(3) 把单链表中的元素逆置(不允许申请新的结点空间)。 (4) 在单链表中删除所有值为偶数的元素结点。

(5) 编写在非递减有序单链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一

个非递减有序单链表。

(6) * 利用算法5建立两个非递减有序单链表,然后合并成一个非递增有序链表。 (7) * 利用算法5建立两个非递减有序单链表,然后合并成一个非递减有序链表。

(8) * 利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为

偶数(尽量利用已知的存储空间)。

(9) * 采用单链表实现一元多项式的存储并实现两个多项式相加并输出结果。 (10) 在主函数中设计一个简单的菜单,分别调试上述算法。 (11) * 综合训练:

1)利用链表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等,并能够实现将数据存储到文件中)

2)约瑟夫环问题:设有n个人围坐在圆桌周围,从某个位置开始编号为1,2,3,…,n,坐在编号为1的位置上的人从1开始报数,数到m的人便出列;下一个(第m+1个)人又从1开始报数,数到m的人便是第二个出列的人;如此重复下去,直到最后一个人出列为止,得到一个出列的编号顺序。例如,当n=8,m=4时,若从第一个位置数起,则出列的次序为4,8,5,2,1,3,7,6。试编写程序确定出列的顺序。要求用不带头结点的单向循环链表作为存储结构模拟此过程,按照出列顺序打印出个人编号。

11

数据结构试验指导书

实验说明:

1.类型定义

typedef int ElemType; //元素类型 typedef struct node {

ElemType data;

struct node *next; }LinkNode, *LinkList;

2.为了算法实现简单,建议采用带头结点的单链表。

注意问题:

1.重点理解链式存储的特点及指针的含义。 2.注意比较顺序存储与链式存储的各自特点。

3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。 4.单链表的操作是数据结构的基础,一定要注意对这部分常见算法的理解。

部分源代码: DS.h

#include #include #include #include

#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

typedef int Status;

LinkList.h

#include \

typedef int Elemtype;

typedef struct Node

12

数据结构试验指导书

{

Elemtype data;

void menu(); /*菜单*/ Status Init_Linklist(LinkList &L); /*初始化空表*/ Status Creat_Linklist(LinkList &L); /*尾插法建立单链表*/ void Disp_Linklist(LinkList L); /*单链表遍历*/ int length_Linklist(LinkList L); /*计算单链表长度*/ void Reverse_Linklist(LinkList L); /*单链表逆置*/

void DelEven_Linklist(LinkList L); /*删除值为偶数的结点*/

Status Insert_Linklist(LinkList L, int x); /*在有序单链表L中插入元素x,链表仍然有序*/ Status CreatOrder_Linklist(LinkList &L); /*创建非递减有序单链表*/

void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc); /*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/

void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc); /*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/

void Split_Linklist(LinkList La, LinkList &Lb); /*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/

struct Node *next; }Lnode,*LinkList;

LinkList.cpp

#include \

void menu() {

printf(\ 单链表基本操作\\n\\n\ printf(\建 立 单 链 表\\n\ printf(\遍 历 单 链 表\\n\ printf(\计 算 链 表 长 度\\n\ printf(\链 表 逆 置\\n\ printf(\删 除 偶 数 节 点\\n\ printf(\生 成 值 有 序 单 链 表\\n\ printf(\合 并 生 成 降 序 链 表\\n\ printf(\合 并 生 成 升 序 链 表\\n\

13

数据结构试验指导书

printf(\分 解 链 表\\n\ printf(\退 出\\n\\n\}

/*初始化空表*/

Status Init_Linklist(LinkList &L) {

L=(LinkList)malloc(sizeof(Lnode)); if(!L) return ERROR; L->next=NULL; return OK;

}

/*尾插法建立单链表*/

Status Creat_Linklist(LinkList &L) { int x;

LinkList p,rear; Init_Linklist(L); rear = L;

printf(\输入-1表示输入结束\\n\ while(scanf(\ {

p = (LinkList)malloc(sizeof(Lnode)); if(!p) return ERROR; p->data = x; rear->next = p; rear = p; }

rear->next = NULL; return OK; }

/*单链表遍历*/

void Disp_Linklist(LinkList L) {

LinkList p; p = L->next; while(p)

14