实验二22 单链表的操作实验指导
单链表的基本操作实验报告

单链表的基本操作实验报告单链表的基本操作实验报告引言:单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
在本次实验中,我们将学习和实践单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等。
一、实验目的本次实验的主要目的是掌握单链表的基本操作,包括链表的创建、插入节点、删除节点和遍历链表。
通过实践操作,加深对单链表的理解,并掌握如何应用单链表解决实际问题。
二、实验过程1. 创建链表首先,我们需要创建一个空链表。
链表可以通过一个头节点来表示,头节点不存储数据,只用于标识链表的起始位置。
我们可以定义一个指针变量head,将其指向头节点。
2. 插入节点在链表中插入节点是常见的操作。
我们可以选择在链表的头部、尾部或者指定位置插入节点。
插入节点的过程可以分为以下几个步骤:a. 创建一个新节点,并为其赋值;b. 找到要插入位置的前一个节点;c. 将新节点的指针指向前一个节点的下一个节点;d. 将前一个节点的指针指向新节点。
3. 删除节点删除节点是另一个常见的操作。
我们可以选择删除链表的头节点、尾节点或者指定位置的节点。
删除节点的过程可以分为以下几个步骤:a. 找到要删除节点的前一个节点;b. 将前一个节点的指针指向要删除节点的下一个节点;c. 释放要删除节点的内存空间。
4. 遍历链表遍历链表是为了查看链表中的元素。
我们可以从头节点开始,依次访问每个节点,并输出节点的值。
三、实验结果在本次实验中,我们成功完成了单链表的基本操作。
通过创建链表、插入节点、删除节点和遍历链表等操作,我们可以方便地对链表进行增删改查操作。
四、实验总结通过本次实验,我们对单链表的基本操作有了更深入的了解。
单链表是一种非常重要的数据结构,广泛应用于各个领域。
掌握了单链表的基本操作,我们可以更好地解决实际问题,并且为以后学习更复杂的数据结构打下坚实的基础。
在实验过程中,我们还发现了一些问题和不足之处。
单链表的基本操作

10)调用头插法的函数,分别输入10,20,分别回车:
11)调用尾插法的函数,分别输入30,40
12)查找单链表的第四个元素:
13)主函数中传入参数,删除单链表的第一个结点:
14)主函数传入参数,删除第0个未位置的元素,程序报错:
15)最后,输出单链表中的元素:
return 0;
}
6)编译,连接,运行源代码:
7)输入8,回车,并输入8个数,用空格分隔开,根据输出信息,可以看出,链表已经拆分为两个
五、实验总结
1.单链表采用的是数据+指针的表示形式,指针域总是指向下一个结
点(结构体)的地址,因此,在内存中的地址空间可以是不连续的,操作比顺序存储更加的方便
2.单链表使用时,需要用malloc函数申请地址空间,最后,删除元
素时,使用free函数释放空间。
单链表的实验报告

单链表的实验报告单链表的实验报告引言:单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
在本次实验中,我们将学习如何使用单链表来实现一些基本的操作,并通过实验验证其功能和效率。
一、实验目的本次实验的主要目的是掌握单链表的基本概念和操作方法,包括插入、删除、查找等操作,并通过实际操作来验证其正确性和效率。
二、实验过程1. 单链表的定义和初始化首先,我们需要定义一个单链表的结构,并初始化一个空链表。
链表的结构可以使用C语言中的结构体来表示,其中包含一个数据域和一个指向下一个节点的指针。
2. 插入操作在已有链表中插入一个新的节点,可以分为两种情况:在链表头部插入和在链表中间插入。
我们可以通过修改指针的指向来实现插入操作。
3. 删除操作删除链表中的一个节点,同样可以分为两种情况:删除头节点和删除中间节点。
删除操作需要注意指针的重新连接,以防止链表断裂。
4. 查找操作在链表中查找指定的元素,可以通过遍历链表的方式来实现。
从链表头开始,依次比较节点的数据域,直到找到目标元素或者遍历到链表尾部。
5. 其他操作在实际应用中,还可以对链表进行排序、逆序、合并等操作,这些操作都可以通过适当的算法来实现。
三、实验结果通过实际操作,我们验证了单链表的各种操作方法的正确性和效率。
在插入、删除和查找操作中,链表的时间复杂度为O(n),其中n为链表的长度。
而在其他操作中,时间复杂度则根据具体算法的实现方式而定。
四、实验总结通过本次实验,我们深入了解了单链表的结构和操作方法,并通过实际操作来验证了其功能和效率。
单链表作为一种常用的数据结构,在实际应用中具有广泛的用途,例如链表可以用来实现栈、队列等其他数据结构,也可以用于解决一些实际问题,如链表的反转、环的检测等。
总之,掌握单链表的基本概念和操作方法对于学习和理解数据结构具有重要意义。
通过实验的方式,我们不仅能够加深对单链表的理解,还能够提高编程能力和解决实际问题的能力。
单链表的基本操作实验报告

湖南第一师范学院信息科学与工程系实验报告课程名称:数据结构与算法成绩评定:实验项目名称:单链表的基本操作指导教师:学生姓名:沈丽桃学号: 10403080118 专业班级: 10教育技术实验项目类型:验证实验地点:科B305 实验时间: 2011 年 10 月20 日一、实验目的与要求:实验目的:实现线性链表的创建、查找、插入、删除与输出。
基本原理:单链表的基本操作二、实验环境:(硬件环境、软件环境)1.硬件环境:奔ⅣPC。
2.软件环境:Windows XP 操作系统,TC2.0或VC++。
三、实验内容:(原理、操作步骤、程序代码等)#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct celltype{int element;struct celltype*next;};typedef int position;void main(){struct celltype*head,*p;int x,choice;void INSERT(int x,struct celltype*p);void LOCATE(int x,struct celltype*p);void DELETE(int x,struct celltype*p);p=(struct celltype*)malloc(sizeof(struct celltype));head=p;p->element=0;p->next=NULL;printf(“Please option:1:Insert 2:Locate 3:Delete\n”);printf(“Please choose:”);scanf(“%d”,&choice);switch(choice)case 1:printf(“Please input a node:”);scanf(“%d”,&x);p=head;INSERT(x,p);for(p=head;p!=NULL;p=p->next)printf(“%d”,p->element);printf(“\n”);break;case 2:printf(“Please input the data you want to locate:”); scanf(“%d”,&x);p=head;LOCATE(x,p);break;case 3:printf(“Please input the data you want to delete:”); scanf(“%d”,&x);DELETE(x,p);for(p=head;p!=NULL;p=p->next)printf(“%d”,p->next);printf(“\n”);break;}void INSERT(int x,struct celltype*p){struct celltype*t,*q;q=(struct celltype*)malloc(sizeof(struct celltype)); q->next=x;while((x>p->element)&&(p!=NULL)){t=p;p=p->next;}if((x>p->element)&&(p->next!=NULL)){p->next=q;q->next=NULL;}else{q->next=p;t->next=q;}}void LOCATE(int x,struct celltype*p){while(p->next!=NULL)if(p->next->element==x)printf(“the number %d is in %d\n”,x,p);else printf(“the number not exist!\n”);}void DELETE(int x,struct celltype*p){while((p->element!=x)&&(p->next!=NULL)){t=p;p=p->next;}if(p->element==x)t->next=p->next}error C2018:unknown character ’Oxal’error C2065:’Please’:undeclared identifiererror C4024:’printf’:different types for formal and actual parameter 1error C4047:’function’:’const*differs in levers of indirection from ’int’error C2146:syntaxerror:missing’)’before identifier’option’error C2017:illegal escape sequenceerror C2059:syntax error:’)’error C2143:syntax error:missing’)’before’%’出现了很多错误,主要是因为printf里的一对双引号不是英文状态下的。
实验二 单链表基本操作

实验二单链表基本操作一、实验目的1.掌握握单链表的基本操作:新建、插入、删除、查找等运算。
二、实验要求1.认真阅读和掌握本实验的程序。
2.上机运行本程序。
3.保存和打印出程序的运行结果,并结合程序中的问题进行分析。
三、实验内容单链表基本操作的实现,这个程序中演示了单链表的创建、插入、删除和查找。
程序如下:#include<malloc.h>typedef struct node{int data;struct node *next;} NODE;/******************************************/NODE *Create()//问题1:该函数创建的带头结点的单链表,还是不带头结点的单链表?{NODE *p,*head;int x;head=(NODE *)malloc(sizeof(NODE));head->next=NULL;printf("Input data,-1 to End!\n");scanf("%d",&x);while(x!=-1){p=(NODE *)malloc(sizeof(NODE));p->data=x;p->next=head->next;head->next=p;scanf("%d",&x);}return(head);}/******************************************/void Output(NODE *head){NODE *p;p=head;printf("Begin to dump the LinkList...\n");while(p->next!=NULL){printf("->%d",p->next->data);p=p->next;}printf("\nThe LinkList ended!\n");}/******************************************/int Listlen(NODE *head){int i=0;NODE *p=head;while(p->next!=NULL){i++;p=p->next;}return(i);}/******************************************/int Get(NODE *head,int i)//问题2:将该函数修改成返回第i个元素的指针,若不存在,返回空{int j=0;NODE *p=head;while(p->next&&j<i){j++;p=p->next;}if(!p->next||j>i) return(0);else return(p->data);}/******************************************/void Del(NODE *head,int i){NODE *p=head;int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next||j>i-1) printf("the position is wrong\n");elsep->next=p->next->next;}/******************************************/void Ins(NODE *head,int i,int e){NODE *p=head,*q;int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next&&j>i-1) printf("Wrong position\n" );else{q=(NODE *)malloc(sizeof(NODE));q->data=e;q->next=p->next;p->next=q;}}/******************************************/main(){NODE *head;int length;int i,element;head=Create();Output(head);//以下函数调用(求长度、插入、删除、查找)能否改成菜单形式?如何改?length=Listlen(head);printf("the length of the link is %d\n",length);printf("input the order :\n");scanf("%d",&i);element=Get(head,i);printf("the element of the order is %d\n",element);printf("input the del position \n");scanf("%d",&i);Del(head,i);Output(head);printf("Input the insert posion and element:\n");scanf("%d%d",&i,&element);Ins(head,i,element);Output(head);}}。
实验二单链表基本操作word文档良心出品

实验二单链表基本操作实验目的1. 学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。
2. 掌握单链表基本操作及两个有序表归并、 单链表逆置等操作的实现。
实验要求1. 预习C 语言中结构体的定义与基本操作方法。
2. 对单链表的每个基本操作用单独的函数实现。
3. 编写完整程序完成下面的实验内容并上机运行。
4. 整理并上交实验报告。
实验内容1.编写程序完成单链表的下列基本操作:(1) ⑵ (3) ⑷ 2 .构造两个带有表头结点的有序单链表 La 、Lb ,编写程序实现将La 、 Lb 合并成一个有序单链表Lc 。
合并思想是:程序需要3个指针:pa 、pb 、pc ,其中pa ,pb 分别指 向La 表与Lb 表中当前待比较插入的结点,pc 指向Lc 表中当前最后一个结 点。
依次扫描La 和Lb中的元素,比较当前元素的值,将较小者链接到 *pc之后,如此重复直到La 或Lb 结束为止,再将另一个链表余下的内容链接到 pc所指的结点之后。
3. 构造一个单链表L ,其头结点指针为head ,编写程序实现将L 逆置。
(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点, 如此等等。
)四思考与提高1. 如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?2. 如何将一个带头结点的单链表 La 分解成两个同样结构的单链表Lb, Lc,使得Lb 中只含La 表中奇数结点,Lc 中含有La 表的偶数结点?1.编写程序完成单链表的下列基本操作:(1) 初始化单链表La 。
(2) 在La 中第i 个元素之前插入一个新结点。
(3) 删除La 中的第i 个元素结点。
(4) 在La 中查找某结点并返回其位置。
初始化单链表La 。
在La 中第i 个元素之前插入一个新结点。
删除La 中的第i 个元素结点。
在La 中查找某结点并返回其位置。
实验报告二——单链表
#include <stdio.h>
#include <stdlib.h>
//单链表的定义:
typedef int DataType;//DataType可以是任何相应的数据类型如int, float或char
typedef struct node//结点类型定义
{DataType data;//结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
int a[10];
void main()
{
int i;
DataType key;
DataType x;
LinkList head;
ListNode *p;
LinkList CreateList(void);//单链表的建立
从键盘输入2个整数一个表示欲插入的位置i另一个表示欲插入的数值x从键盘输入1个整数表示欲删除结点的位巻输出单链表所有结点值观链表中含有原链表中序号为奇数的元链表中含有原链表中序号为偶数的元素且保持原来的相对顺序分别输出单链和单链表b的所有结点值观察输出结果
《数据
实验二—单链表
分校:上海第二工业大学
班级:09安全01
p->next=s;
}
//单链表的删除:
void DeleteList(LinkList head,int i)
{
ListNode *p,*r;
int j;
p=head;j=1;
while(p&&j<i-1)
{
p=p->next;
j++;
单链表的基本操作
实验二:单链表的基本操作编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。
(1)建立一个带头结点的单链表。
(2)计算单链表的长度,然后输出单链表。
(3)查找值为x的直接前驱结点q。
(4)删除值为x的结点。
(5)把单向链表中元素逆置(不允许申请新的结点空间)。
(6)已知单链表中元素递增有序,请写出一个高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,他们的值可以和表中的元素相同,也可以不同)。
(7)同(6)的条件,试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法时间复杂度。
(8)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(9)在主函数中设计一个简单的菜单,分别测试上述算法。
# include <stdio.h># include <stdlib.h>typedef struct node{int data;struct node * next;}Lnode, * LinkList;int m=sizeof(Lnode);//建立新的链表void Bulid_List(LinkList root){int num;LinkList s,p;s=root->next;int n;printf("请输入新建链表的长度n数据:\n"); scanf("%d",&n);printf("请依次建立链表:");for(int i=0;i<n;i++){scanf("%d",&num);s->data=num;p=(LinkList)malloc(m);s->next=p;s=p;s->next=NULL;}printf("链表已建立!\n");}//对链表的输出,包括长度和元素void OutPut_list(LinkList root) {int len=0;LinkList s;s=root->next;if(s->next==NULL)printf("单链表无数据,请先新建单链表。
单链表的操作实现实验报告
题目来源:□√教材页题□√教师补充□自选题目
主要功能描述:链表的初始化、链表的创建(头部插入法、尾部插入法)、求表长、查找(按值查找、按序号查找)、插入、删除、输出、两个有序单链表的合并等。
设计分析:
初始化:为单链表申请头结点空间,将单链表设置为空;创建:(1)头部插入法:(a)初始化空表;(b)申请新结点并赋值;(c)插入新结点;(d)插入第i个元素。
break;
case'1':
puts("\n");
puts("*********************************************************");
puts("* 0---般创建1---头部插入法2---尾部插入法*");
puts("*********************************************************");
r->next=p;
r=p;
}
r->next=NULL;
return h;
}
/*头部插入*/
int CreatfromH(LinkList head)
{
LinkList p;
ElemType x;
puts("输入数据,输入-1000结束输入!");
while(1)
{
scanf("%d",&x);
if(x!=-1000)
while(p!=NULL)
{
printf("\n%d",p->data);
p=p->next;
数据结构实验指导书——单链表的基本操作
void Split_Linklist(LinkList La, LinkList &Lb);/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
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");
实验说明:
1.类型定义
typedefintElemType; //元素类型
typedef structnode
{
ElemType data;
structnode *next;
}LinkNode, *LinkList;
2.为了算法实现简单,建议采用带头结点的单链表。
注意问题:
1.重点理解链式存储的特点及指针的含义。
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*/
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二单链表的应用操作实验指导
【实验编号】2-2
【实验名称】单链表的应用操作实验
【实验学时】2学时
【实验目的】
1.掌握单链表的存储结构,巩固单链表的建表、插入、删除等基本操作。
2.掌握单链表的逆置算法、合并、删除多个元素等等应用型算法。
【实验类型】验证型实验
【实验原理】
链表用一组任意的存储单元来存放线性表的结点,这组存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存中的任何位置上。
通过每个结点存储后继结点的地址将线性表逻辑上连续的元素在物理上联系起来。
单链表由若干结点组成,每个结点设一数据域和一指针域,结点之间通过指针域按其逻辑顺序联系在一起,由于每个结点只有一个后继指针域,故称为单链表,如图1带头结点的单链表逻辑存储示意图。
H
图1 单链表的逻辑存储示意图
单链表可以由头指针唯一确定。
单链表的存储结构描述如下:
typedef struct Node / * 结点类型定义* /
{ ElemType data;
struct Node *next;
}Node, *LinkList;/* LinkList为结构指针类型*/
定义单链表的头指针:
LinkList L;
定义指向单链表任意结点的指针:
Node *s;
引用数据元素:s->data
引用指针域:s->next
【实验内容】
1.编写函数,实现随机产生或键盘输入一组正整型数(以输入-1结束),建立一个带头结点的单链表(有序)。
2.编写函数按顺序输出单链表中的元素。
3.编写函数, 删除单链表中所有大于mink且小于maxk的元素(mink和maxk是给定的两个参变量,类型为正整数)。
4.编写函数,将两个递增有序排列的单链表LA和LB归并为递减有序排列的线性表LC,并要求利用原表(即LA和LB表的)结点空间存放表LC。
(提示:用头插入法)
5.编写函数, 查找链表中倒数第k个位置上的结点(k为正整数)。
若查找成功输出该结点的data域的值,并返回OK;否则返回ERROR。
6.*编写函数,,实现单链表的逆置算法,即在原表的存储空间上将线性表(12,,...,n a a a )逆置为(11,,...,n n a a a )。
【实验要求】
要求:1、部分输入输出在主函数中实现,其他的皆编写成子函数,在主函数调用。
(带*的选作)
2、给出了实验的部分源代码(主要是主函数),要求学生补充完成其他代码,上机调试整个程序。
3、实验完成后,提交实验报告。
给出部分源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define ElemType int
typedef struct Node
{
ElemType data;
Struct Node *next;
}Node, *LinkList;
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
void PrintList(LinkList L)
{
Node *p;
p=L->next;
while(p!=NULL)
{
printf(“%4d ”,p->data);
p=p->next;
}
printf(“\n”);
}
void Creat (LinkList L)
{
// 此处输入建立链表的代码
}
void DelList(LinkList L, int mink, int maxk)
{
// 此处输入在带头结点的单链表中删除所有大于mink且小于maxk的元素代码。
}
LinkList MergeLinkList(LinkList LA, LinkList LB)
{
// 此处输入单链表LA和LB归并为LC的代码。
}
int ListLength(LinkList L)
{
// 此处输入求带头结点的单链表L的长度的代码
}
int Find(LinkList L,int k)
{
//此处输入在单链表L中查找倒数第k个结点的算法
}
void main()
{
LinkList LA,LB,LC;
ElemType X;
Int mink,maxk;
InitList(&LA);
printf(“请输入元素为正整数的有序链表A,-1为结束输入标志:\n”);
Creat(LA);
printf(“请输入删除的范围mink和maxk的值:\n”);
scanf(“%d%d”,&mink,&maxk);
DelList(LA,mink,maxk);
printf(“删除在范围mink和maxk的元素后的链表为:\n”);
PrintList(LA);
InitList(&LB);
printf(“请输入元素为正整数的有序链表B,-1为结束输入标志:\n”);
Creat(LB);
LC=MergeLinkList(LA,LB);
printf(“输出合并A和B后的链表C\n”);
PrintList(LC);
printf(“请输入在链表B中查找的倒数k的值:\n”);
scanf(“%d”,&k);
if (Find(LB,k)) printf(“查找成功\n”);
else printf(“查找不成功\n”);
}
实验报告范例
实验二 单链表表基本操作
专业: 学号: 姓名: 实验日期:
实验名称:
实验目的:
实验原理:
实验内容:
1.编写函数,实现随机产生或键盘输入一组整型数,建立一个带头结点的单链表(有序)。
2.编写函数按顺序输出单链表中的元素。
3.编写函数, 删除单链表中所有大于mink 且小于maxk 的元素(mink 和maxk 是给定的两个参变量,类型为正整数)。
4.编写函数,将两个递增有序排列的单链表LA 和LB 归并为递减有序排列的线性表LC ,并要求利用原表(即LA 和LB 表的)结点空间存放表LC 。
(提示:用头插入法)
5.编写函数, 查找链表中倒数第k 个位置上的结点(k 为正整数)。
若查找成功输出该结点的data 域的值,并返回OK ;否则返回ERROR 。
6.*编写函数,,实现单链表的逆置算法,即在原表的存储空间上将线性表(12,,...,n a a a )逆置为(11,,...,n n a a a )。
实验步骤:
1、 建立自己的文件夹,将所有的程序都放在自己名字命名的文件夹中。
2、 启动VC++
3、 创建单链表的cpp 文件
4、 编辑源程序
/*此处写出程序源代码。
5、 编译源程序
6、 连接
7、 运行
测试结果:
实验分析:
实验心得:。