数据结构实验 链表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称:链表
班级:学号___________姓名:报告日期:
一、实验目的及要求
1. 掌握单链表的存储结构形式及其描述。
2. 掌握单链表的建立、查找、插入和删除操作。
二、实验内容
1. 编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)。
2. 编写函数,实现遍历单链表。
3. 编写函数,实现把单向链表中元素逆置(不允许申请新的结点空间)。
4. 编写函数,建立一个非递减有序单链表。
5. 编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。
6. 编写函数,在非递减有序单链表中插入一个元素使链表仍然有序。
7. 编写函数,实现在非递减有序链表中删除值为x的结点。
8. 编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。
三、实验结果
四、实验总结:
这次实验使我在已经掌握单链表的存储结构,单链表的建立、查找、插入和删除操作的思想的基础上,可以对其利用C语言进行编程的实现,不仅对单链表的有关内容有了更深的理解,同时也对C语言编程的学习有了很大的进步。期间也遇到不少麻烦,;例如在编好程序后,编译运行时出现很多错误,但是在同学和网络的帮助下,将其成功解决。此外,需要注意的就是在用C语言进行编程时,一定要细心,注意基础知识的积累。同时算法思想也很重要。
源代码:
#include
#include
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*Linklist;
void Createlist(Linklist &L)
{
Linklist p,s;
ElemType x;
L=(Linklist)malloc(sizeof(LNode)); L->next=NULL;
p=L;
scanf("%d",&x);
while(x)
{
s=(Linklist)malloc(sizeof(LNode)); s->data=x;
s->next=NULL;
p->next=s;
p=s;
scanf("%d",&x);}
}
void printlist(Linklist &L)
{
Linklist p;
p=L;
while(p->next!=NULL){
p=p->next;
printf("%d ",p->data);}
printf("\n");
}
void nizhi(Linklist &L)
{
Linklist p,s;
p=L->next;
L->next=NULL;
while(p)
{
s=p;
p=p->next;
s->next=L->next;
L->next=s;}
}
void charu(Linklist &L,ElemType x)
{
Linklist p,s;
s=(Linklist)malloc(sizeof(LNode));
s->data=x;
p=L;
while(p->next&&p->next->data<=x)
p=p->next;
s->next=p->next;
p->next=s;
}
void CreatSort(Linklist &L)
{
ElemType x;
L=(Linklist)malloc(sizeof(LNode));
L->next=NULL;
printf("建立非递减有序单链表,随机输入一组数据并以0结束:\n"); scanf("%d",&x);
while(x)
{
charu(L,x);
scanf("%d",&x);}
}
void merger(Linklist La,Linklist Lb,Linklist &Lc)
{
Linklist p,q,s,rear;
p=La->next;
q=Lb->next;
Lc=rear=La;
free(Lb);
while(p&&q){
if(p->data
else {s=q;q=q->next;}
rear->next=s;
rear=rear->next;}
if(p) rear->next=p;else rear->next=q;
}
void shanchu(Linklist &L,ElemType x)
{Linklist p,q;
p=L;
q=L->next;
while(q&&q->data!=x){
p=q;
q=q->next;}
if(!q) printf("\nnot deleted");
else {p->next=q->next;free(q);}
}
void main()
{
Linklist La,Lb,Lc;
ElemType x;
int n;
printf("1.随机盘输入一组元素,建立无序的单链表,以0结束\n");
printf("2.以输出的形式遍历单链表\n");
printf("3.把单向链表中元素逆置\n");
printf("4.建立一个非递减有序单链表\n");
printf("5.建立两个非递减有序单链表,然后合并成一个非递减链表\n"); printf("6.在非递减有序单链表中插入一个元素\n");
printf("7.删除指定的元素\n");
while(1){
printf("请选择:");
scanf("%d",&n);
switch(n)
{case 1:printf("请随机输入一组元素以建立单链表,以0结束:");
Createlist(La);break;
case 2:printf("单链表以输出形式遍历为:");
printlist(La);break;
case 3:nizhi(La);
printf("已建立单链表中的元素逆置为:");
printlist(La);break;
case 4:
CreatSort(La);
printf("所建非递减有序单链表为:");
printlist(La);break;
case 5:
CreatSort(La);
CreatSort(Lb);
merger(La,Lb,Lc);
printf("合并后的单链表为:");
printlist(Lc);break;
case 6:
CreatSort(La);
printf("新建非递减有序单链表为:");
printlist(La);
printf("请输入要插入单链表的元素x:");
scanf("%d",&x);
charu(La,x);
printlist(La);break;
case 7: