数据结构课程设计实验 单链表的插入与删除实验报告

合集下载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

链表实验报告

链表实验报告

《数据结构》实验报告二系别:嵌入式系统工程系班级:嵌入式11003班学号:11160400314 姓名:孙立阔日期:2012年4月9日指导教师:申华一、上机实验的问题和要求:单链表的查找、插入与删除。

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

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

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

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

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

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

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

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

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

二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)创建一个空的单链表,实现对单链表的查找,插入,删除的功能。

三、源程序及注释:#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0#define List_Init_Size 10#define ListIncrement 2typedef char ET;typedef ET * Ep;typedef int Status;typedef struct LNode{ET data;struct LNode *next;}LNode, *LinkList;/*LinkList La,Lb,Lc;*/#include "stdio.h"#include "alloc.h"/*Display the linklist's elements. */void printlk(LinkList L) {LinkList p;p=L->next;while (p) {printf("%c -> ",p->data);p = p->next;}printf("NULL\n");}/*Creat linklist from head node. */void CreatList( LinkList *L,int n){int i;LinkList p,q;ET str[20],c;p=(LinkList)malloc(sizeof(LNode));p->next=NULL;*L = q = p;printf("Please input the data : ");for (i=n;i>0;i--) {p=(LinkList)malloc(sizeof(LNode));c = getche(); /*scanf("%c",&c);*/printf("\n\n");p->data = c;p->next = q->next;q->next = p;}}/*Init the linklist. */void Init(LinkList *L) {int n;printf("Please input the number of the node : "); scanf("%d",&n);CreatList(L,n);}/* Get the value of element I; */int GetElem(LinkList L,int i,ET *e) {int j=1;LinkList p;p=L->next;while(p&&j<i) {p=p->next;++j;}if(!p||j>i) return TRUE;*e=p->data;return FALSE;}/*Insert a element after I */int ListInsert(LinkList *L,int i,ET e) {/* Add your own codes. */}/*Delete the element I */int ListDelete(LinkList *L,int i,ET *e) {/* Add your own codes. */}int Insert(LinkList *L) {int i,flag;ET data;printf("Please input the position : "); scanf("%d",&i);printf("Please input the data : ");data = getche(); /*scanf("%c",&data);*/ flag = ListInsert(L,i,data);return flag;}Status Delete(LinkList *L) {int i,flag;ET e;printf("Please input the number : "); scanf("%d",&i);flag = ListDelete(L,i,&e);printf("Deleted element is %c\n",e); return flag;}/*Find the element's position. */int LocateElem(LinkList L,ET e) {int i=0;LinkList p;p = L->next;while (p) {i++;if (p->data == e) return i;}return 0;}/*Add the Lb after the La. */void Union( LinkList *La ,LinkList *Lb){LinkList pa,pb;/* Add your own codes. */}/*Merge two sequence into one,don't change any elements in these two link lists. Join two sequence to one. */void MergeList(LinkList *L1,LinkList *L2,LinkList *L3) { LinkList pa,pb,pc;/* Add your own codes. */}/*List the Menu*/void MenuList() {printf("\n\n\n==========================\n"); printf(" 1 ******* Insert LA\n");printf(" 2 ******* Insert LB\n");printf(" 3 ******* Delete LA\n");printf(" 4 ******* Delete LB\n");printf(" 5 ******* Union LA and LB\n");printf(" 6 ******* Merge LA and LB to LC\n"); printf(" 7 ******* print LinkList\n");printf(" 8 ******* Exit\n");printf("==========================\n");}/*Select the menu */void MenuSelect(LinkList *La,LinkList *Lb){int select,done=1;LinkList Lc;while (done) {MenuList( );printf("input the operating code : ");scanf("%d",&select);switch(select){case 1: Insert(La);break;case 2: Insert(Lb);break;case 3: Delete(La);break;case 4: Delete(Lb);break;case 5: Union(La,Lb);break;case 6: MergeList(La,Lb,&Lc);printf("LC: ");printlk(Lc);break;case 7: printf("LA: ");printlk(*La);printf("LB: ");printlk(*Lb);break;case 8: done=0;break;default: printf(" ERROR\n");}}}main( ){LinkList La,Lb;printf("LA ");Init(&La) ;printlk(La);printf("LB ");Init(&Lb) ;printlk(Lb);MenuSelect(&La,&Lb);}调试后的代码:#include<stdio.h>#include<malloc.h>typedef int DataType;typedef struct LinkList{int data;struct LinkList *next;}LinkList;void PrintList(LinkList *h);LinkList* InitList();void InsList(LinkList *h,int i,DataType x); void LocList(LinkList *h,int i);void DelList(LinkList *h,int i);void main(){int i,n,x;LinkList *h;h=InitList();PrintList(h);printf("\n===========\n");printf("0------EXIT\n");printf("1------INSERT\n");printf("2------DELERT\n");printf("3------LOCERT\n");printf("\n===========\n\n\n");while(1){printf("\nSelect\n");scanf("%d",&n);switch(n){case 0:exit(0);break;case 1:printf("please input the position:\n");scanf("%d",&n);printf("please input the data:\n");scanf("%d",&x);InsList(h,n,x);PrintList(h);break;case 2:printf("please input you want to delete position:\n");scanf("%d",&i);DelList(h,i);PrintList(h);break;case 3:printf("please input you want to search position:\n");scanf("%d",&i);LocList(h,i);PrintList(h);break;default :printf("error\n");break;}}}LinkList* InitList(){LinkList *h,*s,*r;int a,c,i;h=(LinkList*)malloc(sizeof(LinkList));h->next=NULL;r=h;printf("please input some link's length:");scanf("%d",&c);for(i=0;i<c;i++){scanf("%d",&a);s=(LinkList*)malloc(sizeof(LinkList));s->data=a;s->next=r->next;r->next=s;r=r->next;}return h;}void InsList(LinkList *h,int i,DataType x){LinkList *s,*p;int j=1;p=h;s=(LinkList*)malloc(sizeof(LinkList));for(j=1;j<i && p!=NULL;j++)p=p->next;if(p==NULL)printf("error!\n");else{s->data=x;s->next=p->next;p->next=s;}}void DelList(LinkList *h,int i){LinkList *p,*q;int j=1;p=h->next;q=p->next;while(j!=i-1 && q!=NULL){p=p->next;q=q->next;j++;}if(q==NULL)printf("error!\n");else{p->next=q->next;free(q);}}void LocList(LinkList *h,int i){LinkList *p;int j=1;p=h->next;while(p!=NULL){if(p->data==i){printf("position is %d\n",j);break;}p=p->next;j++;}if(p==NULL)printf("NO this data in the link\n"); }void PrintList(LinkList*h){LinkList *p;p=h->next;while(p!=NULL){printf(" %d ->",p->data);p=p->next;}}四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:问题:子函数和主函数前后的调用出现问题,指针的调用不是太明白。

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

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

计算机学院实验报告课程名称:数据结构实验名称:单链表学生姓名:***学生学号:***********实验日期: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为第一个元素地址,可返回头结点进行重新遍历和查找。

数据结构单链表实验报告

数据结构单链表实验报告

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

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

利用单链表完成以下算法:- 单链表逆序- 查找单链表中的中间节点- 删除单链表中的倒数第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. 单链表:是一种链式存储结构,每个节点包含数据域和指针域。

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

**学院
本科实验报告(**-**学年第一学期)
课程名称:数据结构实验
任课教员:
系:
专业:
年月日
**学院
《数据结构》课程实验报告
实验项目名称:单链表的插入与删除
系()::专业:指导教员:
姓名:学号:成绩:
同组姓名:
实验地点:
1.实验项目名称:单链表的查找、插入与删除
2.实验目的和要求:设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。

通过该算法的设计和C语言程序实现,熟悉针对单链表作为存储结构的线性表上的查找、插入、删除等基本操作的实现方法。

3.实验原理:单链表采用链式存储结构,具有指针域和数据域。

4.实验内容:
1)从键盘输入20个整数,产生不带表头的单链表,并输入结点
值。

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

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

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

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

5.实验环境:Windows2000 visual studio c++
6.操作方法与实验步骤:
(1)实验原代码(c语言版):
#include<stdio.h>
typedef int ElemType;
#include <stdlib.h> /* For _MAX_PATH definition */
#include <malloc.h>
/* 单链表结构的定义*/
typedef struct LNode {
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList;
LinkList CreatList_L(struct LNode **L,int n)
{ /*建立带表头结点的单链表L,n为单链表的大小*/ int i;
struct LNode *p,*q;
p=(struct LNode *)malloc(sizeof (struct LNode));
(*L)=p;
printf("请输入第1个数.");
scanf("%d",&(p->data));
for(i=n-1;i>0;--i)
{ q=(LinkList)malloc(sizeof(struct LNode));/*生成新结点*/ printf("请输入第%d个数.",n-i+1);
scanf("%d",&(q->data));
p->next=q;
p=q;
}p->next=NULL;
return (*L);
}
void print(int c)
{ printf("\t%d",c);
}/*打印函数*/
void FindList(struct LNode *La,ElemType f)
{ struct LNode *cur;
int i=1,u=1;
cur=La;
while(cur !=NULL)
{++i;
if(cur->data==f)
{
printf("在链表中找到了你输入的数字。

\n");
printf("它的位置是%d\n",i-1);
u++;
}/*if*/
cur=cur->next;
}/*while*/
if(u==1)
printf("在链表中找不到你输入的数字。

\n");
}/*查找函数*/
LinkList InsertList(struct LNode *L,int i,int x)
{ struct LNode *q,*p;
int j;
p=L;
q=(struct LNode *)malloc(sizeof(struct LNode));
q->data=x;
if(i==1) {q->next=L;return q;}
else {for(j=1;j<i-1;j++) L=L->next;
q->next=L->next;
L->next=q;
return p;}
}/*插入函数*/
LinkList DeleteList(struct LNode *L, int x) { int i;
if(x==1) L=L->next;
else{ for(i=1;i<x-1;i++)
L=L->next;
L->next=L->next->next;
}
return (L);
}/*删除函数*/
void main()
{ int SIZE,e,Location;
struct LNode La;
struct LNode *p,*l,*head;
l=&La;
printf("请输入链表的大小:");
scanf("%d",& SIZE);
head=CreatList_L(&l,SIZE);
printf("一个新链表已经建立。

\n它是:");
for(p=l;p!=NULL;p=p->next)
print(p->data);//for
printf("\n");
printf("现在开始实验的第二部分\n");
printf("请输入你要查找的数字。

\n");
scanf("%d",&e);
FindList(l,e);
printf("请从键盘输入2个整数,一个表示欲插入的位置Location,另一个表示欲插入的数值e。

\n");
printf("Location=");
scanf("%d",&Location);
printf("\n e=");
scanf("%d",&e);
head=InsertList(l,Location,e);
printf("新链表是:\n");
l=head;
for(e=1;e<=SIZE+1;e++)
{ printf(" %d ",l->data);
l=l->next;
}//for
l=head;
printf("从键盘输入1个整数,表示欲删除结点的位置.\n您要删除的位置是:");
scanf("%d",&e);
head=DeleteList(l,e);
l=head;
printf("新链表是:\n");
for(e=1;e<=SIZE;e++)
{ printf(" %d ",l->data);
l=l->next;
}//for
}
实验如下图:
7.实验结果与分析:实验过程中由于C语言应用的不熟练导致须经教员的多次纠正与指导,才能真正在计算机上实现。

相关文档
最新文档