数据结构实验指导书——单链表的基本操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
Elemtype data;
struct Node *next;
}Lnode,*LinkList;
void menu(); /*菜单*/
Status Init_Linklist(LinkList &L);/*初始化空表*/
Status Creat_Linklist(LinkList &L);/*尾插法建立单链表*/
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
LinkList.h
#include "DS.h"
typedef int Elemtype;
typedef struct Node
实验
实验学时:2学时
实验类型:上机
背景知识:单链表的插入、删除及应用。
目的要求:
1.掌握单链表的存储特点及其实现。
2.掌握单链表的插入、删除算法及其应用算法的程序实现。
实验内容:
编写一个完整的程序,实现单链表的生成、插入、删除、输出等基本操作。
(1)随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
Status Insert_Linklist(LinkList L, int x)
{
LinkList p, q, s;
}
/*创建非递减有序单链表*/
Status CreatOrder_Linklist(LinkList &L)
{
}
/*两个非递减有序单链百度文库La和Lb合并成一个非递增有序链表Lc*/
void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
实验说明:
1.类型定义
typedefintElemType; //元素类型
typedef structnode
{
ElemType data;
structnode *next;
}LinkNode, *LinkList;
2.为了算法实现简单,建议采用带头结点的单链表。
注意问题:
1.重点理解链式存储的特点及指针的含义。
printf("合并后的新链表为:\n");Disp_Linklist(Lc);
break;
case 9:
Creat_Linklist(L);
Split_Linklist(L, Lb);
printf("分裂后的新链表为:\n");
Disp_Linklist(L);
Disp_Linklist(Lb);
printf("\t\t\t0.退出\n\n");
}
/*初始化空表*/
Status Init_Linklist(LinkList &L)
{
}
/*尾插法建立单链表*/
Status Creat_Linklist(LinkList &L)
{
}
/*单链表遍历*/
void Disp_Linklist(LinkList L)
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc);/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void Split_Linklist(LinkList La, LinkList &Lb);/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
(2)计算单链表的长度,遍历单链表。
(3)把单链表中的元素逆置(不允许申请新的结点空间)。
(4)在单链表中删除所有值为偶数的元素结点。
(5)编写在非递减有序单链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单链表。
(6)*利用算法5建立两个非递减有序单链表,然后合并成一个非递增有序链表。
break;
case 0:
return 0;
default:
printf("输入错误,请重新输入\n");
}
}
}
MergeDescend_Linklist(La, Lb, Lc);
printf("合并后的新链表为:\n");Disp_Linklist(Lc);
break;
case 8:
CreatOrder_Linklist(La);
CreatOrder_Linklist(Lb);
MergeAscend_Linklist(La, Lb, Lc);
(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。试编写程序确定出列的顺序。要求用不带头结点的单向循环链表作为存储结构模拟此过程,按照出列顺序打印出个人编号。
LinkList.cpp
#include "LinkList.h"
void menu()
{
printf("\t\t\t单链表基本操作\n\n");
printf("\t\t\t1.建立单链表\n");
printf("\t\t\t2.遍历单链表\n");
printf("\t\t\t3.计算链表长度\n");
printf("\t\t\t4.链表逆置\n");
printf("\t\t\t5.删除偶数节点\n");
printf("\t\t\t6.生成值有序单链表\n");
printf("\t\t\t7.合并生成降序链表\n");
printf("\t\t\t8.合并生成升序链表\n");
printf("\t\t\t9.分解链表\n");
{
}
/*计算单链表长度*/
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 Disp_Linklist(LinkList L);/*单链表遍历*/
int length_Linklist(LinkList L);/*计算单链表长度*/
void Reverse_Linklist(LinkList L);/*单链表逆置*/
void DelEven_Linklist(LinkList L);/*删除值为偶数的结点*/
{
}
/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
{
}
/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
void Split_Linklist(LinkList La, LinkList &Lb)
{
}
main.cpp
#include "LinkList.h"
int main()
{
int choice, length;
LinkList L, La, Lb, Lc;
while(1)
{
menu();
printf("选择你的操作:");
scanf("%d",&choice);
switch(choice)
{
case 1:
if(Creat_Linklist(L))
printf("单链表创建成功\n");
else
printf("单链表创建失败\n");
break;
case 2:
Disp_Linklist(L);
break;
case 3:
length = length_Linklist(L);
printf("单链表长度为:%d\n",length);
(7)*利用算法5建立两个非递减有序单链表,然后合并成一个非递减有序链表。
(8)*利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(9)*采用单链表实现一元多项式的存储并实现两个多项式相加并输出结果。
(10)在主函数中设计一个简单的菜单,分别调试上述算法。
break;
case 4:
Reverse_Linklist(L);
printf("逆置后的链表为:\n");
Disp_Linklist(L);
break;
case 5:
DelEven_Linklist(L);
printf("新链表为:\n");
Disp_Linklist(L);
break;
case 6:
if(CreatOrder_Linklist(L))
{
printf("值有序链表为:\n");
Disp_Linklist(L);
}
else
printf("单链表创建失败\n");
break;
case 7:
CreatOrder_Linklist(La);
CreatOrder_Linklist(Lb);
2.注意比较顺序存储与链式存储的各自特点。
3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
4.单链表的操作是数据结构的基础,一定要注意对这部分常见算法的理解。
部分源代码:
DS.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Elemtype data;
struct Node *next;
}Lnode,*LinkList;
void menu(); /*菜单*/
Status Init_Linklist(LinkList &L);/*初始化空表*/
Status Creat_Linklist(LinkList &L);/*尾插法建立单链表*/
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
LinkList.h
#include "DS.h"
typedef int Elemtype;
typedef struct Node
实验
实验学时:2学时
实验类型:上机
背景知识:单链表的插入、删除及应用。
目的要求:
1.掌握单链表的存储特点及其实现。
2.掌握单链表的插入、删除算法及其应用算法的程序实现。
实验内容:
编写一个完整的程序,实现单链表的生成、插入、删除、输出等基本操作。
(1)随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
Status Insert_Linklist(LinkList L, int x)
{
LinkList p, q, s;
}
/*创建非递减有序单链表*/
Status CreatOrder_Linklist(LinkList &L)
{
}
/*两个非递减有序单链百度文库La和Lb合并成一个非递增有序链表Lc*/
void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
实验说明:
1.类型定义
typedefintElemType; //元素类型
typedef structnode
{
ElemType data;
structnode *next;
}LinkNode, *LinkList;
2.为了算法实现简单,建议采用带头结点的单链表。
注意问题:
1.重点理解链式存储的特点及指针的含义。
printf("合并后的新链表为:\n");Disp_Linklist(Lc);
break;
case 9:
Creat_Linklist(L);
Split_Linklist(L, Lb);
printf("分裂后的新链表为:\n");
Disp_Linklist(L);
Disp_Linklist(Lb);
printf("\t\t\t0.退出\n\n");
}
/*初始化空表*/
Status Init_Linklist(LinkList &L)
{
}
/*尾插法建立单链表*/
Status Creat_Linklist(LinkList &L)
{
}
/*单链表遍历*/
void Disp_Linklist(LinkList L)
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc);/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void Split_Linklist(LinkList La, LinkList &Lb);/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
(2)计算单链表的长度,遍历单链表。
(3)把单链表中的元素逆置(不允许申请新的结点空间)。
(4)在单链表中删除所有值为偶数的元素结点。
(5)编写在非递减有序单链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单链表。
(6)*利用算法5建立两个非递减有序单链表,然后合并成一个非递增有序链表。
break;
case 0:
return 0;
default:
printf("输入错误,请重新输入\n");
}
}
}
MergeDescend_Linklist(La, Lb, Lc);
printf("合并后的新链表为:\n");Disp_Linklist(Lc);
break;
case 8:
CreatOrder_Linklist(La);
CreatOrder_Linklist(Lb);
MergeAscend_Linklist(La, Lb, Lc);
(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。试编写程序确定出列的顺序。要求用不带头结点的单向循环链表作为存储结构模拟此过程,按照出列顺序打印出个人编号。
LinkList.cpp
#include "LinkList.h"
void menu()
{
printf("\t\t\t单链表基本操作\n\n");
printf("\t\t\t1.建立单链表\n");
printf("\t\t\t2.遍历单链表\n");
printf("\t\t\t3.计算链表长度\n");
printf("\t\t\t4.链表逆置\n");
printf("\t\t\t5.删除偶数节点\n");
printf("\t\t\t6.生成值有序单链表\n");
printf("\t\t\t7.合并生成降序链表\n");
printf("\t\t\t8.合并生成升序链表\n");
printf("\t\t\t9.分解链表\n");
{
}
/*计算单链表长度*/
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 Disp_Linklist(LinkList L);/*单链表遍历*/
int length_Linklist(LinkList L);/*计算单链表长度*/
void Reverse_Linklist(LinkList L);/*单链表逆置*/
void DelEven_Linklist(LinkList L);/*删除值为偶数的结点*/
{
}
/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
{
}
/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
void Split_Linklist(LinkList La, LinkList &Lb)
{
}
main.cpp
#include "LinkList.h"
int main()
{
int choice, length;
LinkList L, La, Lb, Lc;
while(1)
{
menu();
printf("选择你的操作:");
scanf("%d",&choice);
switch(choice)
{
case 1:
if(Creat_Linklist(L))
printf("单链表创建成功\n");
else
printf("单链表创建失败\n");
break;
case 2:
Disp_Linklist(L);
break;
case 3:
length = length_Linklist(L);
printf("单链表长度为:%d\n",length);
(7)*利用算法5建立两个非递减有序单链表,然后合并成一个非递减有序链表。
(8)*利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(9)*采用单链表实现一元多项式的存储并实现两个多项式相加并输出结果。
(10)在主函数中设计一个简单的菜单,分别调试上述算法。
break;
case 4:
Reverse_Linklist(L);
printf("逆置后的链表为:\n");
Disp_Linklist(L);
break;
case 5:
DelEven_Linklist(L);
printf("新链表为:\n");
Disp_Linklist(L);
break;
case 6:
if(CreatOrder_Linklist(L))
{
printf("值有序链表为:\n");
Disp_Linklist(L);
}
else
printf("单链表创建失败\n");
break;
case 7:
CreatOrder_Linklist(La);
CreatOrder_Linklist(Lb);
2.注意比较顺序存储与链式存储的各自特点。
3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
4.单链表的操作是数据结构的基础,一定要注意对这部分常见算法的理解。
部分源代码:
DS.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>