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

湖南第一师范学院信息科学与工程系实验报告课程名称:数据结构与算法成绩评定:实验项目名称:单链表的基本操作指导教师:学生姓名:沈丽桃学号: 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里的一对双引号不是英文状态下的。
单链表的基本操作

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

数据结构实验报告--单链表数据结构实验报告--单链表1.引言1.1 研究目的本实验旨在通过实践的方式,深入了解单链表的数据结构以及相关操作,提升对数据结构的理解和应用能力。
1.2 实验内容本实验主要包括以下几个方面的内容:●单链表的基本定义和实现●单链表的插入、删除、遍历操作●单链表的逆置操作●单链表的查找和修改操作2.理论基础2.1 单链表的定义单链表是一种常见的线性数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。
2.2 单链表的基本操作①单链表的插入操作在单链表中,可以通过插入操作在指定位置插入一个新节点,该操作主要包括以下步骤:●创建一个新的节点,并为其赋值●将新节点的next指针指向插入位置的后一个节点●将插入位置的前一个节点的next指针指向新节点②单链表的删除操作在单链表中,可以通过删除操作删除指定位置的节点,该操作主要包括以下步骤:●将删除位置的前一个节点的next指针指向删除位置的后一个节点●释放删除节点的内存③单链表的遍历操作单链表的遍历操作主要是依次访问链表中的每一个节点,并执行相应的操作。
④单链表的逆置操作单链表的逆置操作可以将一个单链表中的节点顺序进行颠倒。
⑤单链表的查找操作在单链表中,可以通过查找操作找到指定值的节点。
⑥单链表的修改操作在单链表中,可以通过修改操作修改指定位置的节点的值。
3.实验过程3.1 实验环境本次实验使用C语言进行编程,需要先安装相应的编程环境,如gcc编译器。
3.2 实验步骤①单链表的创建和初始化首先创建一个空链表,并初始化链表的头指针。
②单链表的插入操作按照需求,在链表的指定位置插入一个新节点。
③单链表的删除操作按照需求,删除链表中的指定位置的节点。
④单链表的遍历操作依次访问链表中的每一个节点,并输出其值。
⑤单链表的逆置操作将单链表中的节点顺序进行逆置。
⑥单链表的查找操作按照需求,在链表中查找指定值的节点。
3.2.7 单链表的修改操作按照需求,修改链表中指定位置的节点的值。
PTA7-4单链表基本操作

PTA7-4单链表基本操作7-4 单链表基本操作请编写程序实现单链表插⼊、删除结点等基本算法。
给定⼀个单链表和⼀系列插⼊、删除结点的操作序列,输出实施上述操作后的链表。
单链表数据域值为整数。
输⼊格式:输⼊第1⾏为1个正整数n,表⽰当前单链表长度;第2⾏为n个空格间隔的整数,为该链表n个元素的数据域值。
第3⾏为1个正整数m,表⽰对该链表施加的操作数量;接下来m⾏,每⾏表⽰⼀个操作,为2个或3个整数,格式为0 k d或1 k。
0 k d表⽰在链表第k个结点后插⼊⼀个数据域值为d的结点,若k=0则表⽰表头插⼊。
1 k表⽰删除链表中第k个结点,此时k不能为0。
注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。
n和m不超过100000。
输出格式:输出为⼀⾏整数,表⽰实施上述m个操作后的链表,每个整数后⼀个空格。
输⼊数据保证结果链表不空。
输⼊样例:51 2 3 4 550 2 80 9 60 0 71 01 6输出样例:7 1 2 8 3 5参照课本的实现#include<iostream>#include<iomanip>#include<stdlib.h>using namespace std;typedef int ElemType;typedef int Status;#define ERROR 0#define OK 1#define OVERFLOW 3typedef struct LNode{ElemType data;struct LNode *next;}LNode ,*LinkList;Status ListInsert(LinkList L,int i,ElemType e){int j=0;LinkList p=L,s;while(p&&j<i-1) // 寻找第i-1个结点{p=p->next;j++;}if(!p||j>i-1) // i⼩于1或者⼤于表长return ERROR;s=(LinkList)malloc(sizeof(LNode)); // ⽣成新结点s->data=e; // 插⼊L中s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList L,int i){int j=0;LinkList p=L,q;while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋{p=p->next;j++;}if(!p->next||j>i-1) // 删除位置不合理return ERROR;q=p->next; // 删除并释放结点p->next=q->next;free(q);return OK;}int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);LinkList L;L=(LinkList)malloc(sizeof(LNode)); // 产⽣头结点,并使L指向此头结点 if(!L) // 存储分配失败exit(OVERFLOW);L->next=NULL;int n=0,m=0;LinkList db=L,da;cin>>n;for(int i=0;i<n;i++){da=(LinkList)malloc(sizeof(LNode));cin>>da->data;da->next=NULL;db->next=da;db = da;}cin>>m;for(int i=0;i<m;i++){int o,x,y;cin>>o;if(o==0){cin>>x>>y;ListInsert(L,x+1,y);}else if(o==1){cin>>x;ListDelete(L,x);}else{exit(ERROR);}}LinkList p=L->next;while(p!=NULL){cout<<p->data<<" ";p = p->next;}return 0;}。
单链表基本操作的实现

单链表基本操作的实现单链表是一种常见的数据结构,它由多个节点组合而成,每个节点包含一个数据元素和一个指向下一个节点的指针。
通过指针,我们可以方便地在单链表中进行插入、删除和遍历等操作。
以下是关于单链表基本操作的实现。
1. 单链表的创建单链表的创建需要定义一个空的头结点,它的作用是方便在链表的头部进行添加和删除节点操作。
一个空的头节点可以在链表初始化的过程中进行创建。
```typedef struct Node{int data;struct Node *next;}Node;Node *createList(){Node *head = (Node*)malloc(sizeof(Node)); //创建空的头节点head->next = NULL;return head; //返回头节点的地址}```2. 单链表的插入单链表的插入可以分为在链表头部插入、在链表尾部插入和在链表中间插入三种情况。
a. 在链表头部插入节点:```void insertAtHead(Node *head, int data){Node *node = (Node*)malloc(sizeof(Node));node->data = data;node->next = head->next;head->next = node;}```b. 在链表尾部插入节点:```void insertAtTail(Node *head, int data){Node *node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;Node *p = head;while(p->next != NULL){p = p->next;}p->next = node;}```c. 在链表中间插入节点:```void insertAtMid(Node *head, int data, int pos){ Node *node = (Node*)malloc(sizeof(Node)); node->data = data;node->next = NULL;Node *p = head;int count = 0;while(p->next != NULL && count < pos-1){ p = p->next;count++;}if(count == pos-1){node->next = p->next;p->next = node;}else{printf("插入位置错误!");}}```3. 单链表的删除单链表的删除可以分为在链表头部删除、在链表尾部删除和在链表中间删除三种情况。
单链表的基本操作实验问题与对策

单链表的基本操作实验问题与对策单链表是一种非常基础且常见的数据结构,被广泛应用于计算机科学和相关领域中。
它通过使用一系列节点来存储元素,每个节点都包含一个值和一个指向下一个节点的指针。
这些节点以线性方式连接,形成了一个单向链表。
在进行单链表的基本操作实验时,可能会遇到一些常见的问题和挑战。
例如,在进行插入操作时,可能会出现指针错误或内存分配失败的问题。
在删除操作中,可能会遇到无法找到指定元素或无法正确更新节点指针的问题。
在进行查找操作时,可能会遇到查找效率低下或无法找到特定元素的问题。
而在遍历操作中,可能会遇到指针断裂或无限循环的问题。
为了解决这些问题,我们可以采取一些对策。
例如,在进行插入操作时,我们可以使用更高效的数据结构或算法来避免指针错误和内存分配失败的问题。
在删除操作中,我们可以使用更精确的查找算法来找到指定元素并正确更新节点指针。
在进行查找操作时,我们可以使用更优化的查找算法或数据结构来提高查找效率并找到特定元素。
而在遍历操作中,我们可以使用更安全的遍历算法来避免指针断裂和无限循环的问题。
总之,单链表是一种非常有用的数据结构,在进行基本操作实验时可能会遇到一些问题和挑战。
但只要我们采取适当的对策,就可以有效地解决这些问题并更好地应用单链表这种数据结构。
问题1:插入节点时如何确保正确的位置?对策:在插入节点之前,需要遍历链表以找到正确的位置。
可以使用循环来遍历链表,确保插入的位置是正确的。
另外,可以考虑维护一个指向前一个节点的指针,以便在插入时更容易操作。
问题2:如何删除节点?对策:删除节点时,需要找到待删除节点的前一个节点,并将其指针指向待删除节点的下一个节点,然后释放待删除节点的内存。
确保在删除节点之前释放内存,以避免内存泄漏。
问题3:如何遍历链表?对策:遍历链表通常需要使用循环,从链表的头节点开始,沿着指针依次访问每个节点,直到达到链表的末尾。
可以使用循环结构来实现遍历,或者使用递归方法。
数据结构单链表实验报告

数据结构单链表实验报告一、实验目的1、深入理解单链表的数据结构及其基本操作。
2、掌握单链表的创建、插入、删除、查找等操作的实现方法。
3、通过实际编程,提高对数据结构和算法的理解和应用能力。
二、实验环境1、操作系统:Windows 102、编程语言:C 语言3、开发工具:Visual Studio 2019三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。
指针域用于指向下一个节点,从而形成链表的链式结构。
单链表的基本操作包括:1、创建链表:通过动态分配内存创建链表的头节点,并初始化链表为空。
2、插入节点:可以在链表的头部、尾部或指定位置插入新的节点。
3、删除节点:根据给定的条件删除链表中的节点。
4、查找节点:在链表中查找满足特定条件的节点。
四、实验内容(一)单链表的创建```cinclude <stdioh>include <stdlibh>//定义链表节点结构体typedef struct Node {int data;struct Node next;} Node;//创建单链表Node createList(){Node head =(Node)malloc(sizeof(Node));if (head == NULL) {printf("内存分配失败!\n");return NULL;}head>data = 0;head>next = NULL;return head;}int main(){Node list = createList();//后续操作return 0;}```在创建单链表时,首先为头节点分配内存空间。
若内存分配失败,则提示错误信息并返回`NULL`。
成功分配内存后,初始化头节点的数据域和指针域。
(二)单链表的插入操作插入操作分为三种情况:头部插入、尾部插入和指定位置插入。
1、头部插入```cvoid insertAtHead(Node head, int data) {Node newNode =(Node)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败!\n");return;}newNode>data = data;newNode>next = head>next;head>next = newNode;}```头部插入时,创建新节点,将新节点的数据域赋值,并将其指针域指向原头节点的下一个节点,然后更新头节点的指针域指向新节点。
单链表的 基本操作

单向链表单向链表的基本操作,创建一个由6个节点组成的单向链表,显示链表中每个节点的数据,并且做增加、删除、查找节点以及计算单链表的长度等处理。
➢需求分析:1.功能(1)用尾插法创建一带头结点的由6个节点组成的单向链表:从键盘读入一组整数,作为单链表中的元素,输入完第6个结点后结束;将创建好的单链表元素依次输出到屏幕上。
(2)显示链表中每个节点的数据(3)从键盘输入一个数,查找在以上创建的单链表中是否存在该数;如果存在,显示它的位置,即第几个元素;如果不存在,给出相应提示如“No found node!”。
(4)在上述的单链表中的指定位置插入指定数据,并输出单链表中所有数据。
(5)删除上述单链表中指定位置的结点,并输出单链表中所有数据。
(6)求单链表的长度并输出.2.输入要求先输入单链表中结点个数n,再输入单链表中所有数据,在单链表中需查找的数据,需插入的数据元素的位置、值,要删除的数据元素的位置。
3。
测试数据单链表中所有数据:12,23,56,21,8,10在单链表中需查找的数据:56;24插入的数据元素的位置、值:1,28;7,28;0,28要删除的数据元素的位置:6➢概要设计:1.算法思想:由于在操作过程中要进行插入、删除等操作,为运算方便,选用带头结点的单链表作数据元素的存储结构.对每个数据元素,由一个数据域和一个指针域组成,数据域放输入的数据值,指针域指向下一个结点。
2.数据结构:单链表结点类型:typedef struct Liistnode {int data;struct Listnode *next;}NODE;3.模块划分:a)用尾插法建立带头结点的单链表*CreateList函数;b)显示链表中每个结点的数据PrintList函数;c)从键盘输入一个数,查找单链表中是否存在该数FoundList函数;d)在单链表中指定位置插入指定数据并输出单链表中所有数据InsertList函数;e)删除单链表中指定位置的结点并输出单链表中所有数据DeleteList函数;f)计算单链表的长度并在屏幕上输出LengthList函数;g)主函数main(),功能是给出测试数据值,建立测试数据值的带头结点的单链表,调用PrintList函数、FoundList函数、InsertList函数、DeleteList函数、LengthList函数实现问题要求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上机实验报告学院:计算机与信息技术学院专业:计算机科学与技术(师范)课程名称:数据结构实验题目:单链表建立及操作班级序号:师范1班学号:201421012731学生姓名:邓雪指导教师:杨红颖完成时间:2015年12月25号一、实验目的:(1)动态地建立单链表;(2)掌握线性表的基本操作:求长度、插入、删除、查找在链式存储结构上的实现;(3)熟悉单链表的应用,明确单链表和顺序表的不同。
二、实验环境:Windows 8.1Microsoft Visual c++ 6.0三、实验内容及要求:建立单链表,实现如下功能:1、建立单链表并输出(头插法建立单链表);2、求表长;3、按位置查找4、按值查找结点;5、后插结点;6、前插结点7、删除结点;四、概要设计:1、通过循环,由键盘输入一串数据。
创建并初始化一个单链表。
2、编写实现相关功能函数,完成子函数模块。
3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。
五、代码:#include<stdio.h>#include<stdlib.h>typedef char datatype;typedef struct node{datatype data;struct node *next;}linklist;linklist *head,*p;//头插法建立单链表linklist *Creatlistf(){char ch;linklist *head,*s;head=NULL;ch=getchar();printf("请输入顺序表元素(数据以$结束):\n");while(ch!='$'){s=(linklist *)malloc(sizeof(linklist));s->data=ch;s->next=head;head=s;ch=getchar();}return head;}//求单链表的长度void get_length(struct node *head){struct node *p=head->next;int length=0;while(p){length++;p=p->next;}head->data=length;printf("该单链表的长度为:%d\n",head->data);}//按序号查找结点linklist *Get(linklist *head,int i){int j;linklist *p;p=head;j=0;while((p->next!=NULL)&&(j<i)){p=p->next;j++;}if(i==j)return p;}//按值查找结点linklist *Locate(linklist *head,datatype key){int pos=0;p=head->next;printf("查找结点位置为:");while(p!=NULL){if(p->data!=key){p=p->next;pos++;}else{pos++;break;}}return p;}//后插结点void Insertafter(linklist *p,datatype x) {linklist *s;s=(linklist *)malloc(sizeof(linklist));s->data=x;s->next=p->next;p->next=s;printf("插入成功");}//前插结点void Insertbefore(linklist *p,datatype x) {linklist *s;s=(linklist *)malloc(sizeof(linklist));s->next=p->next;s->data = p->data;p->data=x;p->next=s;}//删除结点linklist *Deleteafter(linklist *head){int i;linklist *r,*p;printf("请输入要删除的结点位置:");scanf("%d",&i);if(i==1){r=head;head=head->next;}else{p=Get(head,i-1-1);r=p->next;p->next=r->next;}free(r);return head;}//输出单链表void output(linklist *p){while(p->next!=NULL){printf("%c ",p->data);p=p->next;}printf("\n");}void main(){linklist *head;int k,i,pos;char x;datatype key;printf("_____________单链表的操作_____________\n");printf("\t1.头插法建立单链表\n");printf("\t2.输出单链表\n");printf("\t3.求单链表的长度\n");printf("\t4.按序号查找结点\n");printf("\t5.按值查找结点\n");printf("\t6.后插结点\n");printf("\t7.前插结点\n");printf("\t8.删除接点\n");printf("\t9.退出\n");do{printf("选择所需功能: ");scanf("%d",&k);switch(k){case 1:head=Creatlistf();break;case 2:printf("单链表为:\n");output(head);break;case 3:get_length(head);break;case 4:printf("请输入要查找的结点序号:");scanf("%d",&i);getchar();printf("结点的值为:%c\n",Get(head,i-1)->data);break;case 5:printf("请输入要查找的结点值:");scanf("%c",&key);getchar();printf("%d",Locate(head,key));printf("\n");break;case 6:printf("输入要插入的结点位置:");scanf("%d",&pos);getchar();printf("请输入插入的结点值:");scanf("%c",&x);getchar();Insertafter(Get(head,pos-1),x);printf("插入成功");break;case 7:printf("输入要插入的结点位置和结点值(前插)(p,x):");scanf("%d,%c",&pos,&x);getchar();Insertbefore(Get(head,pos-1),x);printf("插入成功");break;case 8:head=Deleteafter(head);break;case 9:printf("退出");exit(0);default:printf("输入错误\n");exit(0);}}while(1);}六、运行界面菜单功能七、实验中遇到的问题及总结二次输出链表元素时链表的第一个结点会变成乱码字符。
第一次输出没有错误。
顺序表和单链表的区别:在顺序表中,我们是用一组地址连续的存储单元来依次存放线性表的结点,因此结点的逻辑次序和物理次序一致。
而链表则不然,链表是用一组任意的存储单元来存放线性表的结点,这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任何位置上,因此,链表中结点的逻辑次序和物理次序不一定相同。
为了能够正确表示结点间的逻辑关系,在存储每个结点值得同时,还必须存储指示后继结点的地址(或位置)信息,这个信息称为指针或链。
本次实验采用头插法建立链表,虽然头插法简单,但生成的链表中结点的的次序和输入的顺序相反。
若希望二者次序一致,可采用尾插法建表。
通过这次程序设计,对单链表的应用理解更深刻更透彻了。
单链表相对于顺序表,插入和删除更加方便,而且不需要考虑存储空间的大小。
但是频繁的读取和数据的查找不甚便捷。
在以后的实验中希望能学到更多。
八、参考文献《数据结构——用C语言描述》。