铜仁市论坛

注册

 

发新话题 回复该主题

数据结构实验1单链表 [复制链接]

1#
北京哪家医院治疗白癜风安全         http://m.39.net/pf/a_4630916.html
实验1单链表

成绩

实验类型:●验证性实验○综合性实验○设计性实验

一、实验目的或任务

通过指导学生上机实践,对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。

二、实验教学基本要求

1.了解实验目的及实验原理;

2.编写程序,并附上程序代码和结果图;

3.总结在编程过程中遇到的问题、解决办法和收获。

三、实验教学的内容或要求

1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)

2.编写函数,实现遍历单链表

3.编写函数,实现把单向链表中元素逆置

4.编写函数,建立一个非递减有序单链表

5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。

6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序

7.编写函数,实现在非递减有序链表中删除值为x的结点

8.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法

四、实验内容

实验总结:

这是我们第一次进行数据结构实验,在这个实验中我体会到了很多,深刻体会到了算法的重要性,同时我们在做好上课听讲之后我们更应该下来自己多多敲代码练习,这样才能够更好的掌握。关于单链表的建立比顺序表更难懂,单链表的建立有头插法和尾插法两种,尾插法较为简单,一定要熟练使用。

实验结果:

实验代码:

#define_CRT_SECURE_NO_WARNINGS

#include

#include

typedefstructNode

{

intdata;

structNode*next;

}Node,*LinkList;

voidInitList(LinkList*L){

*L=(LinkList)malloc(sizeof(Node));

(*L)-next=NULL;

}

voidCreateList(LinkListL)//建立单链表

{

Node*s;

intc;

scanf("%d",c);

while(c){

s=(LinkList)malloc(sizeof(Node));

s-data=c;

s-next=L-next;

L-next=s;

scanf("%d",c);

}

}

voidPrint(LinkListL)//输出并遍历单链表

{

Node*p;

p=L-next;

while(p!=NULL){

printf("%d",p-data);

p=p-next;

}

printf("\n");

}

voidNiZhi(LinkListL)//逆置单链表

{

LinkListp,s;

p=L-next;

L-next=NULL;

while(p){

s=p;

p=p-next;

s-next=L-next;

L-next=s;

}

}

voidFeiDiJian(LinkListL,intx)//建立非递减有序单链表

{

LinkListp,s;

s=(LinkList)malloc(sizeof(LinkList));

s-data=x;

p=L;

while(p-nextp-next-data=x){

p=p-next;

s-next=p-next;

p-next=s;

}

}

voidFeiDiJian2(LinkListL){

intx;

L=(LinkList)malloc(sizeof(LinkList));

L-next=NULL;

printf("建立非递减有序单链表,随即输入一组数据并以0结束:\n");

scanf("%d",x);

while(x){

FeiDiJian(L,x);

scanf("%d",x);

}

}

voidChaRu(LinkListLa,LinkListLb,LinkListLc)//插入一个值在单链表里面

{

LinkListp,q,s,rear;

p=La-next;

q=Lb-next;

Lc=rear=La;

free(Lb);

while(pq){

if(p-dataq-data){

s=p;

p=p-next;

}

else{

s=q;

q=q-next;

}

rear-next=s;

rear=rear-next;

}

if(p){

rear-next=p;

}

elserear-next=q;

}

voidShanChu(LinkListL,intx)//删除一个值但是不影响顺序

{

LinkListp,q;

q=L-next;

p=L;

while(qq-data!=x){

p=q;

q=q-next;

}

if(!q){

printf("notdeleted");

}

else{

p-next=q-next;

free(q);

}

}

voidMenu()

{

printf("======================================================\n");

printf("1.随机输入一组数据,建立无序单链表,以0结束\n");

printf("2.以输出的形式遍历单链表\n");

printf("3.把单链表中的元素逆置\n");

printf("4.建立一个非递减有序单链表\n");

printf("5.建立两个非递减有序单链表,然后合并成一个非递减单链表\n");

printf("6.在非递减有序单链表中插入一个元素\n");

printf("7.删除指定的元素\n");

printf("======================================================\n");

}

voidmain(){

LinkListLa,Lb,Lc;

InitList(La);

InitList(Lb);

InitList(Lc);

intx;

intn=0;

while(1){

Menu();

printf("请选择:");

scanf("%d",n);

switch(n)

{

case1/p>

printf("请输入一组元素以建立单链表,以0结束:");

CreateList(La);

break;

case2/p>

printf("单链表以输出形式遍历为:");

Print(La);

break;

case3/p>

NiZhi(La);

printf("已建立单链表中的元素逆置为:");

Print(La);

break;

case4/p>

FeiDiJian2(La);

printf("所建非递减有序单链表为:");

Print(La);

break;

case5/p>

FeiDiJian2(La);

FeiDiJian2(Lb);

ChaRu(La,Lb,Lc);

printf("合并后的单链表为:");

Print(Lc);

break;

case6:

FeiDiJian2(La);

printf("新建非递减有序单链表为:");

Print(La);

printf("请输入要插入单链表的元素x:");

scanf("%d",x);

FeiDiJian(La,x);

Print(La);

break;

case7:

FeiDiJian2(La);

printf("新建非递减有序单链表为:");

Print(La);

printf("请输入要删除的元素x:");

scanf("%d",x);

ShanChu(La,x);

Print(La);

break;

default:printf("输入有误,请重新选择!\n");

}

}

}

摘要

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题