数据结构单链表的插入和删除实验报告

合集下载

单链表的基本操作实验报告

单链表的基本操作实验报告

单链表的基本操作实验报告单链表的基本操作实验报告引言:单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

在本次实验中,我们将学习和实践单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等。

一、实验目的本次实验的主要目的是掌握单链表的基本操作,包括链表的创建、插入节点、删除节点和遍历链表。

通过实践操作,加深对单链表的理解,并掌握如何应用单链表解决实际问题。

二、实验过程1. 创建链表首先,我们需要创建一个空链表。

链表可以通过一个头节点来表示,头节点不存储数据,只用于标识链表的起始位置。

我们可以定义一个指针变量head,将其指向头节点。

2. 插入节点在链表中插入节点是常见的操作。

我们可以选择在链表的头部、尾部或者指定位置插入节点。

插入节点的过程可以分为以下几个步骤:a. 创建一个新节点,并为其赋值;b. 找到要插入位置的前一个节点;c. 将新节点的指针指向前一个节点的下一个节点;d. 将前一个节点的指针指向新节点。

3. 删除节点删除节点是另一个常见的操作。

我们可以选择删除链表的头节点、尾节点或者指定位置的节点。

删除节点的过程可以分为以下几个步骤:a. 找到要删除节点的前一个节点;b. 将前一个节点的指针指向要删除节点的下一个节点;c. 释放要删除节点的内存空间。

4. 遍历链表遍历链表是为了查看链表中的元素。

我们可以从头节点开始,依次访问每个节点,并输出节点的值。

三、实验结果在本次实验中,我们成功完成了单链表的基本操作。

通过创建链表、插入节点、删除节点和遍历链表等操作,我们可以方便地对链表进行增删改查操作。

四、实验总结通过本次实验,我们对单链表的基本操作有了更深入的了解。

单链表是一种非常重要的数据结构,广泛应用于各个领域。

掌握了单链表的基本操作,我们可以更好地解决实际问题,并且为以后学习更复杂的数据结构打下坚实的基础。

在实验过程中,我们还发现了一些问题和不足之处。

数据结构单链表插入、删除和修改实验报告

数据结构单链表插入、删除和修改实验报告

计算机学院实验报告课程名称:数据结构实验名称:单链表学生姓名:***学生学号:***********实验日期:2012一、实验目的1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。

2.掌握单链表中结点结构的C++描述。

3.熟练掌握单链表的插入、删除和查询算法的设计与C++实现。

二、实验内容1.编制一个演示单链表插入、删除、查找等操作的程序。

三、实验步骤1.需求分析本演示程序用C++6.0编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。

①输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。

在所有输入中,元素的值都是整数。

②输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。

其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。

③程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作。

④测试数据:A.插入操作中依次输入11,12,13,14,15,16,生成一个单链表B.查找操作中依次输入12,15,22返回这3个元素在单链表中的位置C.删除操作中依次输入2,5,删除位于2和5的元素2.概要设计1)为了实现上述程序功能,需要定义单链表的抽象数据类型:(1)insert初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。

(2)decelt操作结果:删除已有的单链表的某些结点。

(3)display操作结果:将上述输入的元素进行排列显示。

(4)modify操作结果:将上述输入的某些元素进行修改。

(5)save操作结果:对上述所有元素进行保存。

(6)load操作结果:对上述元素进行重新装载。

3.使用说明程序执行后显示======================1.单链表的创建2.单链表的显示3.单链表的长度4.取第i个位置的元素5.修改第i个位置的元素6.插入元素到单链表里7.删除单链表里的元素8.合并两个单链表9.退出系统=======================5.源代码:#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n){ LinkList p;L=new LNode;L->next=NULL;LinkList q=L;for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e){ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error;e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) { LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; }if(!p||j>i-1)return error;LinkList s=new LNode;s->data=e;s->next=p->next;p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e){ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){p=p->next;++j; }if(!(p->next)||j>i-1) return error;q=p->next;p->next=q->next;e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L){ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i){ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L){ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing(){ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main(){ int select;int x;ElemType y;LinkList list;for(;;){ cout<<" 单链表的基本操作"<<endl;cout<<" 1.单链表的创建"<<endl;cout<<" 2.单链表的显示"<<endl;cout<<" 3.单链表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到单链表里"<<endl;cout<<" 7.删除单链表里的元素"<<endl;cout<<" 8.合并两个单链表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择所要取出元素的位置:";cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>x; }GetElem(list,x,y);cout<<"该位置的元素为:"<<y<<endl;break;case 5: xiugai(list); break;case 6: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 7: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 8: hebing();break;case 9: exit(0);break;default : cout<<"输入有误,请重新输入"<<endl;break;}}}6.测试结果四、实验总结(结果分析和体会)单链表的最后一个元素的next为null ,所以,一旦遍历到末尾结点就不能再重新开始;而循环链表的最后一个元素的next为第一个元素地址,可返回头结点进行重新遍历和查找。

单链表的实验报告

单链表的实验报告

单链表的实验报告单链表的实验报告引言:单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

在本次实验中,我们将学习如何使用单链表来实现一些基本的操作,并通过实验验证其功能和效率。

一、实验目的本次实验的主要目的是掌握单链表的基本概念和操作方法,包括插入、删除、查找等操作,并通过实际操作来验证其正确性和效率。

二、实验过程1. 单链表的定义和初始化首先,我们需要定义一个单链表的结构,并初始化一个空链表。

链表的结构可以使用C语言中的结构体来表示,其中包含一个数据域和一个指向下一个节点的指针。

2. 插入操作在已有链表中插入一个新的节点,可以分为两种情况:在链表头部插入和在链表中间插入。

我们可以通过修改指针的指向来实现插入操作。

3. 删除操作删除链表中的一个节点,同样可以分为两种情况:删除头节点和删除中间节点。

删除操作需要注意指针的重新连接,以防止链表断裂。

4. 查找操作在链表中查找指定的元素,可以通过遍历链表的方式来实现。

从链表头开始,依次比较节点的数据域,直到找到目标元素或者遍历到链表尾部。

5. 其他操作在实际应用中,还可以对链表进行排序、逆序、合并等操作,这些操作都可以通过适当的算法来实现。

三、实验结果通过实际操作,我们验证了单链表的各种操作方法的正确性和效率。

在插入、删除和查找操作中,链表的时间复杂度为O(n),其中n为链表的长度。

而在其他操作中,时间复杂度则根据具体算法的实现方式而定。

四、实验总结通过本次实验,我们深入了解了单链表的结构和操作方法,并通过实际操作来验证了其功能和效率。

单链表作为一种常用的数据结构,在实际应用中具有广泛的用途,例如链表可以用来实现栈、队列等其他数据结构,也可以用于解决一些实际问题,如链表的反转、环的检测等。

总之,掌握单链表的基本概念和操作方法对于学习和理解数据结构具有重要意义。

通过实验的方式,我们不仅能够加深对单链表的理解,还能够提高编程能力和解决实际问题的能力。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告实验目的:掌握单链表的基本操作,学会使用单链表实现各种算法。

实验内容:实现单链表的基本操作,包括创建、插入、删除、访问等。

利用单链表完成以下算法:- 单链表逆序- 查找单链表中的中间节点- 删除单链表中的倒数第K个节点- 合并两个有序单链表为一个有序单链表实验步骤:1. 创建单链表在创建单链表时,先定义一个结构体Node来表示链表中的节点,节点包括数据域和指针域,指针域指向下一个节点。

然后,用指针p指向链表的头节点,将头节点的指针域初始化为NULL。

2. 插入节点在单链表中插入节点的操作分为两种情况:- 在链表头插入节点- 在链表中间或尾部插入节点无论是哪种情况,先将新节点的指针域指向要插入的位置的下一个节点,再将要插入的位置的指针域指向新节点即可。

3. 删除节点删除链表节点的操作同样分为两种情况:- 删除头节点- 删除中间或尾部节点要删除头节点,先用一个指针将头节点指向的下一个节点保存起来,再将头节点释放掉。

要删除中间或尾部节点,先用一个指针指向要删除节点的前一个节点,然后将指向要删除节点的前一个节点的指针域指向要删除节点的下一个节点,最后将要删除的节点释放掉。

4. 单链表逆序单链表逆序可以使用三个指针来完成,分别为pre指针、cur指针和next指针。

首先将pre指针和cur指针指向NULL,然后循环遍历链表,将cur指针指向当前节点,将next指针指向当前节点的下一个节点,然后将当前节点的指针域指向pre指针,最后将pre指针和cur指针向前移动一个节点,继续进行循环。

5. 查找单链表中的中间节点查找单链表中的中间节点可以使用双指针法,将两个指针p1和p2都指向链表头,然后p1每次向前移动一个节点,而p2每次向前移动两个节点,当p2指向了链表尾部时,p1指向的节点即为中间节点。

6. 删除单链表中的倒数第K个节点删除单链表中的倒数第K个节点可以使用双指针法,在链表中定义两个指针p1和p2,p1指向链表头,p2指向第K个节点,然后p1和p2同时向前移动,直到p2指向链表尾部,此时p1指向的节点即为要删除的节点。

数据结构C语言单链表上实现插入和删除的算法实验报告

数据结构C语言单链表上实现插入和删除的算法实验报告

一、实验目的1.掌握单链表的基本操作:插入、删除、查找以及表的合并等运算。

2.掌握运用C语言上机调试单链表的基本方法。

二、实验任务1.试编写在单链表上实现插入和删除的算法。

三、程序流程图四、测试过程及结果五、总结1.程序特点:最小化、模块化、for循环。

2.单链表特点:动态分配内存、必须从已知指针逐一查找数据、通过改变数据间的链接改变顺序。

附录程序清单#include <stdio.h>#include <stdlib.h>struct NODE{int data;NODE *next;};NODE *creatlink(){NODE *head,*p,*s;int i,n;head=(NODE *)malloc(sizeof(NODE));p=head;scanf("%d",&n);for(i=0;i<n;i++){s=(NODE *)malloc(sizeof(NODE));scanf("%d",&s->data);p->next=s;p=s;}p->next=0;return head;}void print(NODE *p){for(p=p->next;p!=0;p=p->next)printf("%d ",p->data);printf("\n");}void insert(NODE *p,int i,int x){NODE *s;int j;for(j=1;j<i;j++)p=p->next;s=(NODE *)malloc(sizeof(NODE));s->data=x;s->next=p->next;p->next=s;}void Delete(NODE *p,int i){NODE *s;int j;for(j=1;j<i;j++)p=p->next;s=p->next;p->next=s->next;free(s);}void main(){int i,x;NODE A=*creatlink();scanf("%d%d",&i,&x);insert(&A,i,x);print(&A);scanf("%d",&i);Delete(&A,i);print(&A);}。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的单链表概念、原理和操作方法,通过实际编程实现单链表的创建、插入、删除、查找等基本操作,提高对数据结构的实际应用能力和编程技能。

二、实验环境本次实验使用的编程语言为C++,编程工具为Visual Studio 2019。

三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。

指针域用于指向下一个节点,从而形成链表的链式结构。

单链表的优点是可以动态地分配内存,灵活地插入和删除节点,但其缺点是访问特定位置的节点需要从头开始遍历,时间复杂度较高。

四、实验内容(一)单链表的创建创建单链表的基本思路是依次创建节点,并将节点通过指针链接起来。

以下是创建单链表的代码实现:```cppinclude <iostream>using namespace std;//定义链表节点结构体struct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};//创建单链表ListNode createList(){int num, value;cout <<"请输入节点个数: ";cin >> num;ListNode head = NULL;ListNode tail = NULL;for (int i = 0; i < num; i++){cout <<"请输入第"<< i + 1 <<"个节点的值: ";cin >> value;if (head == NULL) {head = newNode;tail = newNode;} else {tail>next = newNode;tail = newNode;}}return head;}```(二)单链表的插入操作单链表的插入操作可以分为在表头插入、在表尾插入和在指定位置插入。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告数据结构单链表实验报告一、实验目的本次实验的主要目的是通过实现单链表数据结构,加深对链表的理解,并通过实际操作掌握链表的基本操作。

二、实验环境1.操作系统:Windows 102.开发环境:C/C++语言3.开发工具:Visual Studio 2019三、实验内容本次实验的内容包括以下几个方面:1.单链表的定义与初始化1.1 单链表的结构定义1.2 创建一个空链表1.3 判断链表是否为空2.单链表的基本操作2.1 在链表头部插入节点2.3 在指定位置插入节点2.4 删除链表的指定节点2.5 查找链表中指定位置的节点2.6 修改链表中指定位置的节点2.7 输出链表中的所有节点3.单链表的应用示例3.1 操作链表实现栈3.2 操作链表实现队列3.3 链表逆置四、实验步骤与结果1.实验步骤1.1 定义一个节点结构体,包含数据域和指针域 1.2 创建一个空链表1.3 插入节点到链表的指定位置1.4 删除链表中的指定节点1.5 修改链表中的指定节点1.7 实现链表的应用示例2.实验结果经过以上步骤的操作,我们成功实现了单链表的各种基本操作,并实现了链表作为栈和队列的应用示例。

五、实验总结通过本次实验,我们深入理解了单链表的原理和基本操作,掌握了链表的插入、删除、查找等操作方法。

同时,我们还学会了如何应用链表来实现栈和队列等数据结构。

通过实际操作,巩固了对数据结构的理解和应用能力。

附件:无法律名词及注释:1.数据结构:是计算机存储、组织数据的方式,是指一组数据的表达方式,以及定义在该组数据上的一组操作。

2.链表:链表是一种常见的数据结构,用于存储有序的元素集合。

每个节点包含一个元素和一个指向下一个节点的指针。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告范本:数据结构单链表实验报告一、引言本实验旨在掌握数据结构中单链表的基本概念、操作和应用。

通过实际操作,理解单链表的结构与实现,提高数据结构的编程能力和问题解决能力。

二、实验目的1. 理解单链表的概念和特点;2. 掌握单链表的基本操作,包括插入、删除、遍历;3. 学会使用单链表解决实际问题。

三、实验内容1. 单链表的定义和结构设计;2. 单链表的基本操作的实现,包括插入节点、删除节点、遍历;3. 针对具体的问题,设计相应的单链表操作。

四、实验步骤1. 单链表的定义和结构设计:(1)定义单链表的结构体,包含数据域和指针域;(2)实现单链表的初始化函数;(3)实现单链表的销毁函数。

2. 单链表的基本操作的实现:(1)实现单链表的插入节点操作;(2)实现单链表的删除节点操作;(3)实现单链表的遍历操作。

3. 针对具体问题的单链表操作:(1)根据具体需求,设计并实现相应的操作函数;(2)利用单链表解决具体问题。

五、实验结果与分析1. 在实验过程中,成功实现了单链表的定义和结构设计,包括数据域和指针域的正确设置。

2. 实验中实现了插入节点、删除节点和遍历等基本操作。

3. 针对具体问题,通过单链表操作解决了相应的问题。

六、实验总结通过本次实验,加深了对单链表的理解和掌握。

掌握了单链表的基本操作和应用实现,提高了数据结构的编程能力和问题解决能力。

附件:1. 本文所涉及的代码文件;2. 实验过程中所用到的数据文件。

法律名词及注释:1. 数据结构:指的是一组数据的表示方法和相应的操作。

在计算机科学中,数据结构是计算机中存储、组织数据的方式。

2. 单链表:是一种链式存储结构,每个节点包含数据域和指针域。

数据域用于存储数据,指针域用于指向下一个节点。

数据结构单链表实验报告

数据结构单链表实验报告
{
Node *r, *s;
char c;
int flag =1; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/
{
c=getchar();
pre=L;
k=0;
while(pre->next!=NULL && k<i-1)/*寻找被删除结点i的前驱结点i-1使p指向它*/
{
pre=pre->next;
k=k+1;
}/*查找第i-1个结点*/
if(!(pre->next)) /* 即while循环是因为p->next=NULL或i<1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。*/
k=k+1;
}/*查找第i-1结点*/
if(!pre) /*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理*/
{
printf("插入位置不合理!");
return ERROR;
}
s=(Node*)malloc(sizeof(Node)); /*申请一个新的结点S */
s->data=e; /*值e置入s的数据域*/
*l=(LinkList)malloc(sizeof(Node)); /*申请结点空间*/
(*l)->next=NULL; /*置为空表*/
}
void CreateFromHead(LinkList L)
{

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告一、实验目的本实验的目的是通过设计和实现单链表数据结构,加深对于单链表的理解和掌握,并能够灵活应用单链表解决实际问题。

二、实验内容1·理解单链表的概念和基本操作2·设计并实现单链表数据结构3·实现单链表的创建、插入、删除和查找操作4·应用单链表解决实际问题三、实验步骤1·理解单链表的概念和基本操作单链表是一种常见的线性链表结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

单链表的基本操作包括创建链表、插入节点、删除节点和查找节点等。

2·设计并实现单链表数据结构首先,定义单链表节点的结构,包含数据元素和指向下一个节点的指针。

然后,定义一个链表结构,包含头节点和尾节点的指针。

3·实现单链表的创建、插入、删除和查找操作●创建链表:通过依次插入节点的方式创建一个空的链表。

●插入节点:根据插入位置,将新节点插入到链表中的适当位置。

●删除节点:根据节点的值或位置,删除链表中的对应节点。

●查找节点:根据节点的值或位置,在链表中查找对应节点。

4·应用单链表解决实际问题通过设计和实现单链表数据结构,应用单链表解决实际问题,如实现一个通讯录、一个待办事项列表等。

四、实验结果根据实验步骤,我们成功设计并实现了单链表数据结构,并应用单链表解决了实际问题。

经过测试,单链表的创建、插入、删除和查找操作均正常工作。

五、实验总结通过本次实验,我们深入学习了单链表的概念和基本操作。

通过设计和实现单链表数据结构,并应用单链表解决实际问题,加深了对于单链表的理解和掌握。

六、附件本实验报告涉及的附件包括实验代码和测试数据。

七、法律名词及注释1·数据结构:数据结构是计算机存储、组织数据的方式,是程序设计和算法设计的基础。

2·单链表:单链表是一种常见的线性链表结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

单链表的插入和删除

单链表的插入和删除

数据结构[第一次]实验报告学院:班级:学号:姓名:实验一(一)实验名称:单链表的插入和删除。

(二)实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

(三)实验要求:所编的程序能正确运行,并提交实验报告。

(四)源代码:#include"stdio.h"#include"string.h"#include"stdlib.h"#include"ctype.h"typedef struct node //定义结点{char data[10]; //结点的数据域为字符串struct node *next; //结点的指针域}ListNode;typedef ListNode * LinkList; // 自定义LinkList单链表类型LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(); //函数,按值查找结点void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值void DeleteAll(); //函数,删除所有结点,释放内存//==========按值查找结点,找到则返回该结点的位置,否则返回NULL========== ListNode *LocateNode(LinkList head, char *key){ListNode *p=head->next; //从开始结点比较while(p&&strcmp(p->data,key)!=0) //直到p为NULL或p->data为key止p=p->next; //指向下一个结点return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点}//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void){char ch[10];LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点ListNode *s,*r,*t;r=head;r->next=NULL;printf("Input # to end "); //输入"#"代表输入结束printf("Please input Node_data:");scanf("%s",ch); //输入各结点的字符串while(strcmp(ch,"#")!=0) {t=LocateNode(head,ch); //按值查找结点,返回结点指针if(t==NULL) { //没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);r->next=s;r=s;r->next=NULL;}printf("Input # to end ");printf("Please input Node_data:");scanf("%s",ch);}return head; //返回头指针}ListNode *AddNode(LinkList head){char ch[10];ListNode *t,*s;printf("请输入你要插入的字符串:");scanf("%s",ch);t= LocateNode(head,ch);if(t== NULL){s = (ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);s->next = head->next;head->next = s;}return head;}//==========删除带头结点的单链表中的指定结点=======void DeleteList(LinkList head,char *key){ListNode *p,*r,*q=head;p=LocateNode(head,key); //按key值查找结点的if(p==NULL ) { //若没有找到结点,退出printf("position error");exit(0);}while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next;r=q->next;q->next=r->next;free(r); //释放结点}//===========打印链表=======void printlist(LinkList head){ListNode *p=head->next; //从开始结点打印while(p){printf("%s, ",p->data);p=p->next;}printf("\n");}//==========删除所有结点,释放空间===========void DeleteAll(LinkList head){ListNode *p=head,*r;while(p->next){r=p->next;free(p);p=r;}free(p);}//==========主函数==============void main(){char ch[10],num[10];LinkList head;head=CreatListR1(); //用尾插入法建立单链表,返回头指针printlist(head); //遍历链表输出其值printf(" 是否删除结点(y/n):"); //输入"y"或"n"去选择是否删除结点scanf("%s",num);if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){printf("请输入要删除的字符串:");scanf("%s",ch); //输入要删除的字符串DeleteList(head,ch);printlist(head);}printf("Add Node(y/n)");scanf("%s",num);if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){head = AddNode(head);}printlist(head);DeleteAll(head); //删除所有结点,释放内存}(五)运行结果:“删除和插入”“删除”“插入”(六)需求分析1、输入的形式和输出值的范围:输入若干个字符串,以“#”为结尾。

单链表的查找、插入与删除

单链表的查找、插入与删除

《数据结构》实验报告一题目:单链表的查找、插入与删除班级:电子0802学号:姓名:日期:2011.03.08 程序名:cqq1.c一、上机实验的问题和要求:单链表的查找、插入与删除。

设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。

具体实现要求:1.从键盘输入20个整数,产生不带表头的单链表,并输入结点值。

2.从键盘输入1个整数,在单链表中查找该结点的位置。

若找到,则显示“找到了”;否则,则显示“找不到”。

3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。

4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。

5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。

6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。

7.把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。

8.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。

二、程序设计的基本思想,原理和算法描述:1、基本操作函数link * get(link *l, int i);//创建链表link * ins (link *l, int a,int i) //在链表内插入值link * find(link *l, int a);//在链表内查找值link * del(link *l, int i); //在链表内删除值link * delrepeat( link *l); //在链表内删除重复值link * deleven(link *l); //删除链表内偶数值link * rotate(link *l); //形成循环链表void divide(link *l); //分解成两个链表cout<<endl;2、基本操作cout<<"请选择您要的操作:";cout<<" 1、插入";cout<<" 2、查找";cout<<" 3、删除";cout<<" 4、删除重复结点";cout<<" 5、删除偶数结点";cout<<" 6、构建循环链表";cout<<" 7、分解为两个链表";cout<<" 0、退出";三、源程序及注释:#include <iostream>using namespace std;typedef struct node{int data;struct node *next;}link;void print1(link *l);link * get(link *l, int i){link *p;int j=0;p=l;while((j<i) && (p->next!=NULL)){p=p->next;j++;}if(j==i)return p;elsereturn NULL;}link * ins (link *l, int a,int i){link *p,*s;p=get(l,i-1);if(p==NULL)cout<<"输入有误"<<endl;else{s=(link *)malloc(sizeof(link));s->data=a;s->next=p->next;p->next=s;}return l;}link * find(link *l, int a){link *p;int i=0;int j=0;p=l;while(p!=NULL){i++;if(p->data!=a)p=p->next;else{cout<<"您查找的数据在第"<<i-1<<"个位置."<<endl;j=1;p=p->next;}}if(j!=1)cout<<"您查找的数据不在线性表中."<<endl;return l;}link * del(link *l, int i){link *p,*s;p=get(l,i-1);if(p==NULL)cout<<"输入有误"<<endl;else{s=p->next;p->next=s->next;free(s);}return l;}link * delrepeat( link *l) // 删除相同元素并释放内存{link *s, *r, *t;if ( l-> next == NULL )return l;s = l-> next;while ( s-> next ){t = s; r = s-> next;while ( t-> next ){if ( s-> data == r-> data ){t-> next = r-> next;free(r);r = t-> next;}else{t = t-> next;r = t-> next;}}s = s-> next;if ( !s )return l;}return l;}link * deleven(link *l){link *q=l;link *p=l->next;while(p){if(p->data%2==0){link *r=p;q->next=p->next;p=p->next;free(r);}{p=p->next;q=q->next;}}return l;}link * rotate(link *l){link * p=l;while(p->next)p=p->next;p->next=l;link * t=l->next;while(t!=l){t=t->next;}cout<<"已经变为循环链表,其他操作将受影响,程序结束!"<<'\n';return l;}void divide(link *l){link * a=l;link * b=(link *)malloc(sizeof(node));b->next=NULL;link *Lb=b;int i=1;link * La=l;link * p=l->next;while(p){if(i++%2==0){La->next=p->next;p->next=NULL;Lb->next=p;Lb=Lb->next;p=La->next;}{p=p->next;La=La->next;}}cout<<"链表a";print1(a);cout<<"链表b";print1(b);}void print1(link *l){int i,k;int a;link *p,*q;cout<<"当前线性表为:"<<endl;p=l;p=p->next;if(l!=NULL)do{cout<<p->data<<" ";p=p->next;}while(p!=NULL);cout<<endl;}link * print(link *l){int i,k;int a;link *p,*q;cout<<"当前线性表为:"<<endl;p=l;p=p->next;if(l!=NULL)do{cout<<p->data<<" ";p=p->next;}while(p!=NULL);cout<<endl;cout<<"请选择您要的操作:";cout<<" 1、插入";cout<<" 2、查找";cout<<" 3、删除";cout<<" 4、删除重复结点";cout<<" 5、删除偶数结点";cout<<" 6、构建循环链表";cout<<" 7、分解为两个链表";cout<<" 0、退出";cout<<endl;cin>>k;if(k==1){cout<<"请输入您要插入的数据值:";cin>>a;cout<<"请输入您要插入的位置:";cin>>i;p=ins(l,a,i);q=print(l);}else if(k==2){cout<<"请输入您要查找的数据值:";cin>>a;p=find(l,a);q=print(l);}else if(k==3){cout<<"请输入您要删除的数据的位置:";cin>>i;p=del(l,i);q=print(l);}else if(k==4){cout<<"删除重复结点后的";p=delrepeat(l);q=print(l);}else if(k==5){cout<<"删除偶数结点后的";p=deleven(l);q=print(l);}else if(k==6){p=rotate(l);q=print(l);}else if(k==7){divide(l);}else if(k==0);else{cout<<"输入错误!"<<endl;}return l;}int main(){cout<<"请输入20个整数:"<<endl;int ch[20];int i;//link *head;link *r,*p,*q,*l;l=(link *)malloc(sizeof(link));l->next=NULL;r=l;for(i=0;i<20;i++){cin>>ch[i];p=(link *)malloc(sizeof(link));p->data=ch[i];p->next=NULL;r->next=p;r=r->next;}q=print(l);return 0;}四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:1、本次实验采用C++语言,程序基本能实现实验所要求的操作功能,但是首次使用C++来完成所有链表的操作,有很多小细节不够注意,比如定义结点与结点的使用,需要多操作,多熟悉语。

单链表地插入和删除实验报告材料

单链表地插入和删除实验报告材料

实用文档实验一、单链表的插入和删除一、目的了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

二、要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。

三、程序源代码#include"stdio.h"#include"string.h"#include"stdlib.h"#include"ctype.h"typedef struct node //定义结点{char data[10]; //结点的数据域为字符串struct node *next; //结点的指针域}ListNode;typedef ListNode * LinkList; // 自定义LinkList单链表类型LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(); //函数,按值查找结点void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值void DeleteAll(); //函数,删除所有结点,释放内存//==========主函数==============void main(){char ch[10],num[10];LinkList head;head=CreatListR1(); //用尾插入法建立单链表,返回头指针 printlist(head); //遍历链表输出其值printf(" Delete node (y/n):");//输入“y”或“n”去选择是否删除结点scanf("%s",num);if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){ printf("Please input Delete_data:");scanf("%s",ch); //输入要删除的字符串 DeleteList(head,ch);printlist(head);}DeleteAll(head); //删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void){char ch[10];LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点ListNode *s,*r,*pp;r=head;r->next=NULL;printf("Input # to end "); //输入“#”代表输入结束printf("Please input Node_data:");scanf("%s",ch); //输入各结点的字符串while(strcmp(ch,"#")!=0) {pp=LocateNode(head,ch); //按值查找结点,返回结点指针 if(pp==NULL) { //没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);r->next=s;r=s;r->next=NULL;}printf("Input # to end ");printf("Please input Node_data:");scanf("%s",ch);}return head; //返回头指针}//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========ListNode *LocateNode(LinkList head, char *key){ListNode *p=head->next; //从开始结点比较while(p&&strcmp(p->data,key)!=0 ) //直到p为NULL或p-> data为key止p=p->next; //扫描下一个结点return p; //若p=NULL则查找失败,否则p指向找到的值key的结点}//==========删除带头结点的单链表中的指定结点=======void DeleteList(LinkList head,char *key){ListNode *p,*r,*q=head;p=LocateNode(head,key); //按key值查找结点的if(p==NULL ) { //若没有找到结点,退出printf("position error");exit(0);}while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next;r=q->next;q->next=r->next;free(r); //释放结点}//===========打印链表=======void printlist(LinkList head){ListNode *p=head->next; //从开始结点打印while(p){printf("%s, ",p->data);p=p->next;}printf("\n");}//==========删除所有结点,释放空间===========void DeleteAll(LinkList head){ListNode *p=head,*r;while(p->next){r=p->next;free(p);p=r;}free(p);}运行结果:加的添加结点的代码:int Insert(ListNode *head) // the insert function {ListNode *in,*p,*q;int wh;printf("input the insert node:");in=(ListNode *)malloc(sizeof(ListNode));in->next=NULL;p=(ListNode *)malloc(sizeof(ListNode));p->next=NULL;q=(ListNode *)malloc(sizeof(ListNode));q->next=NULL;if(!in)return 0;scanf("%s",in->data);printf("input the place where you want to insert you data:");scanf("%d",&wh);for(p=head;wh>0;p=p->next,wh--);q=p->next;p->next=in;in->next=q;return 1;}运行结果:最后提示为OK 添加成功。

单链表的操作实验报告

单链表的操作实验报告

单链表的操作实验报告单链表的操作实验报告引言:单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

在本次实验中,我们将学习如何使用C语言实现单链表的基本操作,包括插入、删除和查找等。

一、单链表的定义和初始化单链表由节点组成,每个节点包含数据和指向下一个节点的指针。

首先,我们需要定义一个节点的结构体,如下所示:```struct Node {int data; // 节点数据struct Node* next; // 指向下一个节点的指针};```在初始化单链表之前,我们需要创建一个头节点,它不存储任何数据,只用于指向第一个节点。

初始化单链表的代码如下:```struct Node* head = NULL; // 头节点初始化为空```二、单链表的插入操作插入操作是向单链表中添加新节点的过程。

我们可以在链表的头部、尾部或者指定位置插入新节点。

下面以在链表头部插入新节点为例进行说明。

首先,我们需要创建一个新节点,并为其分配内存空间:```struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));```然后,为新节点赋值并将其插入到链表头部:```newNode->data = 10; // 赋值新节点的数据newNode->next = head; // 将新节点的指针指向原头节点head = newNode; // 将头节点指向新节点```三、单链表的删除操作删除操作是从单链表中删除指定节点的过程。

我们可以根据节点的位置或者数据进行删除。

下面以删除链表中指定数据的节点为例进行说明。

首先,我们需要遍历链表找到要删除的节点,并记录其前一个节点的地址:```struct Node* current = head;struct Node* previous = NULL;int targetData = 10; // 要删除的节点数据while (current != NULL && current->data != targetData) {previous = current;current = current->next;}```然后,将前一个节点的指针指向要删除节点的下一个节点,并释放要删除节点的内存空间:```previous->next = current->next;free(current);```四、单链表的查找操作查找操作是在单链表中查找指定数据的节点。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告数据结构单链表实验报告1. 引言数据结构是计算机科学中的重要基础,它研究数据的组织、存储和管理方式。

单链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

本实验旨在通过实践操作单链表,加深对数据结构的理解。

2. 实验目的本实验的主要目的是掌握单链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表。

通过实践操作,加深对链表的理解,提高编程能力和解决问题的能力。

3. 实验环境和工具本实验使用C语言进行编程实现,可以选择任何C语言开发环境,如Dev-C++、Code::Blocks等。

在编程过程中,可以使用任何文本编辑器编写代码。

4. 实验步骤4.1 创建链表首先,需要定义一个节点结构体,包含数据和指向下一个节点的指针。

然后,通过动态内存分配来创建链表的第一个节点,并将其地址赋给头指针。

接下来,可以通过输入数据的方式,逐个创建链表的其他节点。

4.2 插入节点在链表中插入节点是一种常见的操作。

可以在链表的任意位置插入一个新节点,只需要修改相应节点的指针即可。

首先,需要找到插入位置的前一个节点,然后将新节点的指针指向原来的下一个节点,再将前一个节点的指针指向新节点。

4.3 删除节点删除链表中的节点也是一种常见的操作。

可以根据节点的值或位置来删除节点。

首先,需要找到要删除的节点的前一个节点,然后将前一个节点的指针指向要删除节点的下一个节点,最后释放要删除节点的内存空间。

4.4 遍历链表遍历链表是一种查看链表中所有节点的操作。

可以通过循环遍历链表中的每个节点,输出节点的值或进行其他操作。

需要注意的是,遍历链表时需要使用一个临时指针来指向当前节点,以便于移动到下一个节点。

5. 实验结果与分析通过实验,我们成功实现了单链表的创建、插入、删除和遍历操作。

在实际应用中,单链表可以用于实现各种数据结构和算法,如栈、队列和图等。

它具有灵活性和高效性的特点,可以方便地进行节点的插入和删除操作。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告实验目的:本实验的目的是通过实现单链表数据结构,加深对数据结构的理解,并掌握单链表的基本操作和算法。

实验内容:1、单链表的定义单链表由若干个节点组成,每个节点包含数据域和指针域,数据域存储具体数据,指针域指向下一个节点。

单链表的头指针指向链表的第一个节点。

2、单链表的基本操作2.1 初始化链表初始化链表时,将头指针置空,表示链表为空。

2.2 插入节点插入节点可以分为头插法和尾插法。

- 头插法:将新节点插入链表头部,新节点的指针域指向原头节点,头指针指向新节点。

- 尾插法:将新节点插入链表尾部,新节点的指针域置空,原尾节点的指针域指向新节点。

2.3 删除节点删除节点可以分为按位置删除和按值删除两种方式。

- 按位置删除:给定要删除节点的位置,修改前一节点的指针域即可。

- 按值删除:给定要删除节点的值,遍历链表找到对应节点,修改前一节点的指针域即可。

2.4 遍历链表遍历链表即按顺序访问链表的每个节点,并输出节点的数据。

2.5 查找节点查找节点可以分为按位置查找和按值查找两种方式。

- 按位置查找:给定节点的位置,通过遍历链表找到对应节点。

- 按值查找:给定节点的值,通过遍历链表找到第一个匹配的节点。

实验步骤:1、根据实验目的,定义单链表的结构体和基本操作函数。

2、实现初始化链表的函数,将头指针置空。

3、实现头插法或尾插法插入节点的函数。

4、实现按位置删除节点的函数。

5、实现按值删除节点的函数。

6、实现遍历链表的函数,输出节点的数据。

7、实现按位置查找节点的函数。

8、实现按值查找节点的函数。

9、设计实验样例,测试单链表的各种操作。

实验结果与分析:通过测试实验样例,我们可以验证单链表的各种操作是否正确。

如果出现异常情况,可通过调试找出问题所在,并进行修改。

单链表的操作时间复杂度与操作的位置有关,对于查找操作,时间复杂度为O(n);对于插入和删除操作,时间复杂度也为O(n)。

附件:1、单链表的定义和基本操作的源代码文件。

单链表的插入和删除

单链表的插入和删除

实验一单链表的插入和删除(4个机时)1.1 实验目的:已知线性表中元素为“TANKK︼YOU”,利用模块化编程思想,编程实现如下函数功能:1)建立一个带头结点的单链表,将线性表中元素依次放入(函数1);输出该单链表中各元素(函数4)。

2)删除单链表中的第四个元素(函数2);输出执行删除操作之后的单链表(函数4);3)在单链表中的第二个元素前插入元素“H”(函数3);输出执行插入操作之后的单链表(函数4)。

1.2 流程图”1.3 实验步骤及程序代码#include<stdio.h>#include<string.h>#include<malloc.h>struct ZFSZ //定义指针类型{int chardata;struct ZFSZ*next;};#define LEN sizeof(struct ZFSZ)#define N 10char c[N]={'t','a','n','k','k','*','y','o','u'}; //字符数组定义,保存字符“tankk+you”struct ZFSZ* creat() //函数一:建立链表{int a;struct ZFSZ *head;struct ZFSZ *p1,*p2;a=0;p1=(struct ZFSZ*)malloc(LEN);p1->chardata=c[0];while(p1->chardata!=NULL){a=a+1;if(a==1){head=p1;}else{p2->next=p1;}p2=p1;p1=(struct ZFSZ*)malloc(LEN);p1->chardata=c[a];}p2->next=NULL;return(head);}void Print (ZFSZ*head) //函数二:建立打印程序,输出链表中的内容{struct ZFSZ*Pp1,*Phead;Phead=head;Pp1=head;while (Pp1!=NULL&&Pp1->chardata!=0){printf("%c",Pp1->chardata);Pp1=Pp1->next;}printf("\n");}void Dell(ZFSZ*head) //函数三:删除第四个元素{struct ZFSZ*Dp1,*Dp2,*Dhead;Dhead=head;int n=1;for(n;n<=4;n++){if(n==3){Dp1=Dhead;}if(n==4){Dp2=Dhead->next;}Dhead=Dhead->next;}free(Dp1->next);Dp1->next=Dp2;}void ChaRu(struct ZFSZ*head) //函数四:再第二个元素前插入字符‘h’{struct ZFSZ*Cp1,*Cp2,*Chead;Chead=head;int m=1;for(m;m<=2;m++){if(m==1){Cp1=Chead;}Cp2=Chead->next;}Chead=(struct ZFSZ*)malloc(LEN);scanf("%c",&Chead->chardata);Cp1->next=Chead;Chead->next=Cp2;}int main() //主函数{struct ZFSZ *head; //调用函数一,建立链表head = creat();Print(head); //调用函数二输出链表中的内容Dell(head); //调用函数三:删除第四个元素Print(head); //调用函数二输出链表中的内容ChaRu(head); //调用函数四:再第二个元素前插入字符‘h’Print(head); //调用函数二输出链表中的内容}1.4 实验结果。

单链表的插入和删除实验报告

单链表的插入和删除实验报告

实验一、单链表的插入和删除一、目的了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

二、要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。

三、程序源代码#include"stdio.h"#include"string.h"#include"stdlib.h"#include"ctype.h"typedef struct node //定义结点{char data[10]; //结点的数据域为字符串struct node *next; //结点的指针域}ListNode;typedef ListNode * LinkList; // 自定义LinkList单链表类型LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(); //函数,按值查找结点void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值void DeleteAll(); //函数,删除所有结点,释放内存//==========主函数==============void main(){char ch[10],num[10];LinkList head;head=CreatListR1(); //用尾插入法建立单链表,返回头指针 printlist(head); //遍历链表输出其值printf(" Delete node (y/n):");//输入“y”或“n”去选择是否删除结点scanf("%s",num);if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){ printf("Please input Delete_data:");scanf("%s",ch); //输入要删除的字符串 DeleteList(head,ch);printlist(head);}DeleteAll(head); //删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void){char ch[10];LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点ListNode *s,*r,*pp;r=head;r->next=NULL;printf("Input # to end "); //输入“#”代表输入结束printf("Please input Node_data:");scanf("%s",ch); //输入各结点的字符串while(strcmp(ch,"#")!=0) {pp=LocateNode(head,ch); //按值查找结点,返回结点指针 if(pp==NULL) { //没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);r->next=s;r=s;r->next=NULL;}printf("Input # to end ");printf("Please input Node_data:");scanf("%s",ch);}return head; //返回头指针}//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========ListNode *LocateNode(LinkList head, char *key){ListNode *p=head->next; //从开始结点比较while(p&&strcmp(p->data,key)!=0 ) //直到p为NULL或p-> data为key止p=p->next; //扫描下一个结点return p; //若p=NULL则查找失败,否则p指向找到的值key的结点}//==========删除带头结点的单链表中的指定结点=======void DeleteList(LinkList head,char *key){ListNode *p,*r,*q=head;p=LocateNode(head,key); //按key值查找结点的if(p==NULL ) { //若没有找到结点,退出printf("position error");exit(0);}while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next;r=q->next;q->next=r->next;free(r); //释放结点}//===========打印链表=======void printlist(LinkList head){ListNode *p=head->next; //从开始结点打印while(p){printf("%s, ",p->data);p=p->next;}printf("\n");}//==========删除所有结点,释放空间===========void DeleteAll(LinkList head){ListNode *p=head,*r;while(p->next){r=p->next;free(p);p=r;}free(p);}运行结果:加的添加结点的代码:int Insert(ListNode *head) // the insert function {ListNode *in,*p,*q;int wh;printf("input the insert node:");in=(ListNode *)malloc(sizeof(ListNode));in->next=NULL;p=(ListNode *)malloc(sizeof(ListNode));p->next=NULL;q=(ListNode *)malloc(sizeof(ListNode));q->next=NULL;if(!in)return 0;scanf("%s",in->data);printf("input the place where you want to insert you data:");scanf("%d",&wh);for(p=head;wh>0;p=p->next,wh--);q=p->next;p->next=in;in->next=q;return 1;}运行结果:最后提示为OK 添加成功。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
Status LinkListInsert(LinkList &L,inti,ElemType e)//向链表中插入某个元素
{
LinkList p,s;
p = L;
intj = 0;
while(p && j < i-1)
{
p = p->next;
j++;
}
if(!p || j > i-1)
returnERROR;
{
q = L->next;
for(intk = 0; k < len-1; k++)
{
if(q->data > q->next->data)
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
returnOK;
一、实验目的
熟悉vb6.0操作,要求单链表的数据域是字符串,且不允许重复的串插入表中;删除操作是数据输入的字符串,先找到相应的接点,后删除。
二、实验步骤(或程序)
#defineTRUE 1
#defineFALSE 0
#defineOK 1
#defineERROR 0
#defineINFEASIBLE -1
//删除La中的第i个元素结点
printf("请输入要删除节点的位置:");
scanf("%d",&pos);
if(LinkListDelete(La,pos,e))
{
printf("删除第%d个元素%d成功!\n",pos,e);
Len_La--;
}
else
puts("删除失败!");
system("PAUSE");
free(q);
returnOK;
}
intLinkListLocate(LinkList &L,ElemType e)//在单链表L中查找值为e的结点,找到后返回其位置,否则返回
{
LinkList p;
intj = 1;
p = L->next;
while(p && p->data != e)
{
p = p->next;
typedefstห้องสมุดไป่ตู้uctLNode
{
ElemType data;
structLNode *next;
}LNode,*LinkList;
Status InitLinkList(LinkList& L)//初始化链表
{
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
pos = LinkListLocate(La,e);
if(pos)
printf("值为%d的节点的位置是:%d\n",e,pos);
else
puts("查找的节点不存在!");
system("PAUSE");
putchar('\n');
}
三.实验结果
附件二:
实验报告打印格式说明
1.标题:三号加粗黑体
自学考试计算机系列课程
实践性环节实验报告本
课程名称数据结构
实验学期2010至2011学年第2学期
年级大三专业通信工程
学生姓名陈榕学号************
指导教师涂风华
实验最终成绩
重庆大学计算机学院制
实验名称
单链表的插入和删除
实验时间
2011年5月13号
实验地点
主楼第二软件实验室
课堂成绩
报告成绩
最终成绩
//确定La的长度
printf("La的长度为: ");
scanf("%d",&Len_La);
//初始化La
if(InitLinkList(La))
printf("初始化La成功!\n");
system("PAUSE");
putchar('\n');
//向La中随机添加元素并且非递减排序
if(FillLinkList(La,Len_La) && Ascend(La,Len_La))
p->data = rand()%100;
p->next = L->next;
L->next = p;
}
returnOK;
}
Status Ascend(LinkList& L,intlen)//非递减排序
{
LinkList q;
ElemType temp;
for(intj = 0; j < len-1; j++)
putchar('\n');
//在La中第i个元素之前插入一个新结点
printf("请输入要插入新节点的位置:");
scanf("%d",&pos);
printf("请输入要插入新节点的值:");
scanf("%d",&e);
if(LinkListInsert(La,pos,e))
{
printf("插入新节点成功!\n");
j++;
}
if(p && p->data == e)
returnj;
else
return0;
}
voidPrintLinkList(LinkList &L,intlen)//打印链表
{
LinkList p = L->next;
for(inti = 0;i < len; i++)
{
printf("%d\t",p->data);
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
returnOK;
}
Status LinkListDelete(LinkList &L,inti,ElemType &e)//删除链表中的某个元素
printf("向La中随机添加元素并且非递减排序成功!\n");
else
puts("向La中添加元素失败!");
system("PAUSE");
putchar('\n');
//打印添加元素后的La
printf("添加元素后的La为:\n");
PrintLinkList(La,Len_La);
system("PAUSE");
putchar('\n');
//打印删除后的La
printf("删除节点后的La为:\n");
PrintLinkList(La,Len_La);
system("PAUSE");
putchar('\n');
//在La中查找某结点并返回其位置
printf("请输入要查找的节点的值:");
scanf("%d",&e);
returnOK;
}
Status FillLinkList(LinkList& L,intlen)//向链表中随机填充数据
{
srand(time(NULL));
LinkList p;
for(inti = len;i > 0; i--)
{
p = (LinkList)malloc(sizeof(LNode));
}
free(L);
returnOK;
}
voidmain()
{
LinkList La;
ElemType e;
intpos,Len_La;
/***************************************第题主程序************************************/
puts("***以下为第题程序***");
Len_La++;
}
else
puts("插入新节点失败!");
system("PAUSE");
putchar('\n');
//打印插入新节点后的La
printf("插入新节点后的La为:\n");
PrintLinkList(La,Len_La);
system("PAUSE");
putchar('\n');
#defineOVERFLOW -2
#defineLIST_INIT_SIZE 10
#defineLIST_INCREMENT 2
#defineStatusint
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
相关文档
最新文档