单链表插入操作

合集下载

单链表查找插入删除算法时间效率分析

单链表查找插入删除算法时间效率分析

单链表查找插⼊删除算法时间效率分析单链表查找时间效率分析:
代码:
Lnode *LocateElem_L(LinkList L, ElemType e){
//在线性表L中查找值为 e 的数据元素
//找到,则返回 L 中值为 e 的数据元素的地址
//查找失败返回NULL
p=L->next;
while(p!=NULL && p->data!=e){
p=p->next;
}
return p;
}
上述代码中,循环体⾥的 p=p->next 执⾏多少次?或者说循环执⾏多少次,和我们要查找的元素 e 所在位置有关系如果单链表中第⼀个元素,或者说⾸元结点就是 e ,那么仅执⾏⼀次即可。

如果不是,则顺着指针链,依次向后查找。

因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间福再度为 O(n)。

插⼊和删除:
因线性链表在插⼊或删除时,不需要移动元素,只要修改指针,⼀般情况下时间复杂度为O(1)。

但是,如果要在单链表中进⾏前插或删除操作,由于要从头查找前驱结点,所耗时间复杂度为O(n)。

进⾏插⼊和删除的操作是常数即便,但是寻找前驱才要O(n)。

单链表头插法代码

单链表头插法代码

单链表头插法代码单链表是一种常见的数据结构,它由多个节点组成,每个节点包括两部分:一个数据存储区和一个指向下一个节点的指针。

插入操作是单链表的基本操作之一,在插入一个节点时,可以采用两种方法:头插法和尾插法。

在本篇文章中,我们将重点讲解单链表的头插法。

头插法是指在单链表的头节点之前插入一个新节点。

这种方法需要先创建一个新节点,并将其指针指向原头节点所指向的节点。

然后再将头节点的指针指向新节点。

相当于是在链表的头部插入新节点。

下面是头插法的代码实现:```struct node {int data;struct node *next;};void insert_node(struct node **head, int value) {struct node *new_node = (struct node*)malloc(sizeof(struct node));new_node->data = value;new_node->next = *head;*head = new_node;}```在上面的代码中,我们首先定义了一个节点结构体node,其中包含一个int类型的数据成员data和一个指向下一个节点的指针成员next。

然后,我们定义一个函数insert_node,这个函数的作用是向单链表中插入新的节点。

其中,head是指向链表头节点的指针,value 是要插入的节点的值。

在insert_node函数体中,我们首先通过malloc函数动态分配内存,创建一个新节点new_node。

然后,将新节点的data成员赋值为value,将新节点的next指针指向原head指针所指向的节点,最后将head指针指向新节点new_node。

这样,新节点就插入到链表的头部了。

总结一下,头插法是单链表中比较常用的一种插入节点的方式,通过这种方法,可以很方便地在链表头部插入新节点。

在实现的过程中需要注意,在创建新节点时要手动分配内存,否则会发生内存错误。

数据结构实验报告--单链表

数据结构实验报告--单链表

数据结构实验报告--单链表数据结构实验报告--单链表1.引言1.1 研究目的本实验旨在通过实践的方式,深入了解单链表的数据结构以及相关操作,提升对数据结构的理解和应用能力。

1.2 实验内容本实验主要包括以下几个方面的内容:●单链表的基本定义和实现●单链表的插入、删除、遍历操作●单链表的逆置操作●单链表的查找和修改操作2.理论基础2.1 单链表的定义单链表是一种常见的线性数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。

2.2 单链表的基本操作①单链表的插入操作在单链表中,可以通过插入操作在指定位置插入一个新节点,该操作主要包括以下步骤:●创建一个新的节点,并为其赋值●将新节点的next指针指向插入位置的后一个节点●将插入位置的前一个节点的next指针指向新节点②单链表的删除操作在单链表中,可以通过删除操作删除指定位置的节点,该操作主要包括以下步骤:●将删除位置的前一个节点的next指针指向删除位置的后一个节点●释放删除节点的内存③单链表的遍历操作单链表的遍历操作主要是依次访问链表中的每一个节点,并执行相应的操作。

④单链表的逆置操作单链表的逆置操作可以将一个单链表中的节点顺序进行颠倒。

⑤单链表的查找操作在单链表中,可以通过查找操作找到指定值的节点。

⑥单链表的修改操作在单链表中,可以通过修改操作修改指定位置的节点的值。

3.实验过程3.1 实验环境本次实验使用C语言进行编程,需要先安装相应的编程环境,如gcc编译器。

3.2 实验步骤①单链表的创建和初始化首先创建一个空链表,并初始化链表的头指针。

②单链表的插入操作按照需求,在链表的指定位置插入一个新节点。

③单链表的删除操作按照需求,删除链表中的指定位置的节点。

④单链表的遍历操作依次访问链表中的每一个节点,并输出其值。

⑤单链表的逆置操作将单链表中的节点顺序进行逆置。

⑥单链表的查找操作按照需求,在链表中查找指定值的节点。

3.2.7 单链表的修改操作按照需求,修改链表中指定位置的节点的值。

链表的插入操作总结

链表的插入操作总结

链表的插⼊操作总结链表是⼀种经常使⽤的数据结构,有单链表, 双向链表及其循环链表之分.
插⼊操作是链表的基本操作之中的⼀个.但⼤部分⼈在初学时,多少会感到有些迷惑.
以下时本⼈的⼀些⼩经验.
1 后向插⼊和前向插⼊
如果当前节点为P.
后向插⼊是指在p节点后插⼊新节点.
前向插⼊是指在p节点后插⼊新节点.
对于单链表⽽⾔,仅仅有后向插⼊.
2 基本规律
1) 先保存原链表结构不变,即先改动新节点的前后指针,然后再先远后近.
2) 先远后近是指先改动离p节点远的指针,在改动离它近的指针.
3 链表操作⽰意图
下图是可⾏的⼏种链表插⼊⽅法.都是依照上述的基本规律实现的.⾃⼰能够依据⾃⼰的喜好选择⼀种.。

数据结构单链表实验报告

数据结构单链表实验报告

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

二、实验环境本次实验使用的编程语言为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. 单链表的创建单链表的创建需要定义一个空的头结点,它的作用是方便在链表的头部进行添加和删除节点操作。

一个空的头节点可以在链表初始化的过程中进行创建。

```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. 单链表的删除单链表的删除可以分为在链表头部删除、在链表尾部删除和在链表中间删除三种情况。

单链表的插入

单链表的插入

第二部分 新课讲授
银行突然来了一个 VIP大客户,急需办 理大笔资金业务,这 个时候就需要插队
第二部分 新课讲授
(1)
在单链表的最前面插入一个值为x的结点:
(2) 在q所指的结点后插入一个P所指的值为x的新结点:
单链表 的插入
第二部分 新课讲授
(1)在单链表的最前面插入一个值 为x的结点:
单链表 的插入
第二部分 新课讲授
(2)在q所指的结点后插入一个P所指的值为x的新结点:
第三部分 总结反思
重点掌握单链表的插入操作; 思考单链表插入操作的算法描述;
感谢聆听! 请多指导!
《数据结构(C语言版)》
单链表的插入
问题引入 新课讲授 总结反思
第一ቤተ መጻሕፍቲ ባይዱ分 问题引入
第二部分 新课讲授
单链表的 基本概念
单链表的结点,一般含有两个 域,一个是存放数据信息的info 域,另一人是指向该结点的后 继结点存放地址的指针next域。
每个结点的存储形式:
info
next
第二部分 新课讲授 单链表的直观图示

c语言单链表尾插法

c语言单链表尾插法

C语言单链表尾插法1. 简介单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

单链表尾插法是一种在链表尾部插入新节点的方法,通过将新节点插入到链表尾部,可以方便地实现链表的动态扩展和插入操作。

本文将详细介绍C语言中单链表尾插法的实现方法,包括链表结构的定义、节点的插入操作、遍历和释放链表等。

2. 链表结构定义在C语言中,我们可以通过结构体来定义链表的节点。

每个节点包含两个部分:数据域和指针域。

typedef struct Node {int data; // 数据域struct Node* next; // 指针域,指向下一个节点} Node;在上述代码中,我们定义了一个名为Node的结构体,其中data表示节点的数据,next表示指向下一个节点的指针。

通过typedef关键字,我们将struct Node重命名为Node,方便后续使用。

3. 节点的插入操作3.1 创建新节点在进行节点的插入操作之前,我们需要先创建一个新的节点。

可以通过动态内存分配函数malloc来分配内存,并使用free函数释放内存。

Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");exit(1);}newNode->data = data;newNode->next = NULL;return newNode;}上述代码中,我们定义了一个名为createNode的函数,该函数接受一个整数参数data,用于初始化新节点的数据域。

首先使用malloc函数分配内存,并将返回的指针强制转换为Node*类型。

然后,我们检查内存分配是否成功,如果失败,则打印错误信息并调用exit函数退出程序。

接着,我们将新节点的数据域设置为传入的data值,指针域设置为NULL,最后返回新节点的指针。

12-5_单链表的插入

12-5_单链表的插入
单链表的插入
插入实际上就是要把新元素插入到链表的第i个位置 之前。例如下图为把元素s插入到第i个元素结点之前:
p
i-1
置之前的,因此i的取值范围 是1到表长+1。具体的做法是先用指针p找到第i-1个结点的位 置, 然后修改s的指针域,让其指向第i个结点,接着再去修
改p的指针域,让其指向s,这样就完成了插入操作。
单链表的插入
带头结点链表的插入代码 int ListInsert (LinkList L, int i, ElemType value) { int j=1; LinkList p=L, s; for( ; p&&j<i; p=p->next, j++); // 找第 i-1 个
结点
if( i<1 || p==NULL )
表长加 1
// i<1 或大于
return ERROR; s=(LinkList)malloc(sizeof(LNode));
新结点 s->data=value;
// 建立
// 给插入的结点赋值
网站主页
网站主页: ( C语言视
频教程 ) 为了更好的排版效果,请下载:方正准圆简体和微 软雅黑这两种字体。只需把这两种字体放到 C:\WINDOWS\Fonts 的文件夹中即可。

单链表的 基本操作

单链表的 基本操作

单向链表单向链表的基本操作,创建一个由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函数实现问题要求。

写出在单链表中某p结点后插入s结点的语句。

写出在单链表中某p结点后插入s结点的语句。

题目:在单链表中某p结点后插入s结点的语句序号一、单链表的基本概念在讨论如何在单链表中某p结点后插入s结点的语句之前,我们有必要先了解单链表的基本概念。

单链表是一种常见的数据结构,由若干个结点组成,每个结点都包含两部分:数据域和指针域。

数据域用来存储结点的数据,指针域用来指向下一个结点,通过这种指针的连接,将若干个结点串联在一起,形成链式结构。

序号二、单链表的插入操作在单链表中,插入操作是指在指定位置插入新的结点。

而在某个结点之后插入新的结点,是一种常见的插入操作。

假设有结点p和s,现在的任务是要在p结点后插入s结点,那么需要进行以下几个步骤:1. 找到结点p的位置:遍历单链表,找到指定结点p的位置。

2. 创建新的结点s:分配内存空间,将新的结点s的数据域赋值。

3. 信息操作:将新的结点s的指针域指向p结点的后继结点,然后将p结点的指针域指向新的结点s。

序号三、具体语句在C语言中,如果要实现在单链表中某p结点后插入s结点的语句,可以采用以下伪代码表示:// 定义结点类型typedef struct Node{int data;struct Node *next;}Node;// 插入操作函数void insertNode(Node *p, int value){Node *s = (Node *)malloc(sizeof(Node)); // 创建新的结点ss->data = value; // 赋值s->next = p->next; // 新结点s的指针指向p结点的后继结点p->next = s; // p结点的指针指向新结点s}```在这个函数中,我们首先创建了新的结点s,然后将新结点s的指针指向p结点的后继结点,最后将p结点的指针指向新结点s,从而实现了在p结点后插入s结点的操作。

总结和回顾:通过以上讨论,我们详细了解了在单链表中某p结点后插入s结点的操作步骤和具体实现。

单链表的操作实验报告

单链表的操作实验报告

单链表的操作实验报告《单链表的操作实验报告》在计算机科学领域,数据结构是非常重要的基础知识之一。

而单链表作为一种常见的数据结构,经常被用来存储和操作数据。

在本次实验中,我们将对单链表的操作进行实验,并撰写实验报告以总结和分享我们的实验结果。

实验目的:1. 了解单链表的基本概念和操作方法。

2. 掌握单链表的插入、删除、查找等操作。

3. 通过实际操作加深对单链表的理解和掌握。

实验环境:1. 编程语言:C/C++2. 开发环境:Visual Studio Code3. 实验工具:GCC编译器实验步骤:1. 定义单链表的结构体,并实现初始化、插入、删除、查找等操作的函数。

2. 编写测试用例,对单链表的各种操作进行测试。

3. 分析实验结果,总结操作的时间复杂度和空间复杂度。

4. 撰写实验报告,分享实验过程和结果。

实验结果:经过实验,我们成功实现了单链表的初始化、插入、删除、查找等操作,并对这些操作进行了充分的测试。

我们发现单链表的插入和删除操作的时间复杂度为O(1),而查找操作的时间复杂度为O(n),其中n为链表的长度。

这些结果与我们的预期相符合,说明我们对单链表的操作有了较好的掌握。

实验总结:通过本次实验,我们不仅加深了对单链表的理解,还提高了编程能力和数据结构的应用能力。

我们对单链表的操作有了更深入的了解,为以后在实际项目中应用单链表打下了良好的基础。

结语:单链表作为一种常见的数据结构,在实际应用中具有重要的作用。

通过本次实验,我们对单链表的操作有了更深入的了解,相信在以后的学习和工作中能够更好地应用和运用单链表。

希望本次实验报告能够对读者有所帮助,也欢迎大家对实验结果进行讨论和交流。

实验二 单链表的插入和删除

实验二   单链表的插入和删除

实验二 单链表的插入和删除1.实验目的:了解单链表的基本概念、结构的定义及在单链表上的基本操作(插入、删除、查找以及线性表合并),通过在VC 实现以上操作更好的了解书本上的内容并体会线性表的两种存储结构的区别。

2.实验预备知识:⑴ 复习C 语言中指针的用法,特别是结构体的指针的用法;⑵ 了解单链表的概念,单链表的定义方法;单链表是线性表的链式存储表示,是用一组任意的存储单元依次存储线性表的数据元素。

因此,为了表示每个数据元素a i 与其直接后继元素a i+1之间的逻辑关系,对数据元素ai 来说,,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),而这部分就是用指针来完成的。

⑶ 掌握线性表在链式存储结构上实现基本操作:查找、插入、删除的算法; 在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容:在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出错误提示)。

在实现插入的时候,由于是链式存储,它可以随机产生和回收存储空间,所以它不要判断线性表是否为满,但仍需判断要插入的位置是否合法,原因同实验一,其次要注意插入的时候语句的顺序不可颠倒,否则出错。

例如:s 所指向结点要插入在p 所指向的结点之后,则:正确形式:s->next=p->nextp->next=s错误形式:p->next=ss->next=p->next(因为此时p->next 已经指向s 了)在实现删除的时候,首先要判断线性表是否为空,为空则不能删除; 其次在删除后要回收空间。

例如:删除如上图所示s 所指向的结点p->next=p->next->nextfree s3.实验内容:⑴ 单链表的插入算法⑵ 单链表的删除算法⑶循环链表的插入和删除算法4.部分实验代码:⑴单链表的结构定义:#include <stdio.h>typedef int elemtype;typedef struct lnode{ elemtype data;struct lnode *next;}*linklist;⑵建立单链表的算法int n; /*n作为整个程序的全局变量*/linklist *creat(void){ linklist *head, *p1, *p2;n=0;p1=p2=(linklist *)malloc(sizeof(linklist));scanf(“%d”,&p1->data);head=null;while(p1->data!=0){ n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(linklist *)malloc(sizeof(linklist));scanf(“%d”,&p1->data);}p2->next=null;return(head);}⑶单链表的插入算法int insert(linklist *head, int i,elemtype e) { linklist *p, *s;int j;p=head; j=0;while(p && j<i-1){ p=p->next;++j;}if(!p||j>i-1){ printf(“无法插入”);return 0;}s=(linklist *)malloc(sizeof(lnode));s->data=e;s->next=p->next;p->next=s;return 1;}⑷单链表的删除算法int deltree(linklist *head,int i,elemtype e){ linklist *p, *q;int j;lp=head; j=0;while(p->next && j<i-1){ p=p->next;++j;}if(!(p->next)||j>i-1){ printf(“无法删除”);return 0;}q=p->next;p->next=q->next;e=q->data;free(q);return 1;}。

用C#实现单链表(插入,在第i个前插,在第i个后插)

用C#实现单链表(插入,在第i个前插,在第i个后插)

⽤C#实现单链表(插⼊,在第i个前插,在第i个后插)初学C#记录历程,记录⼼情。

在学习的过程中严重参考了前辈们在⽹上的分享,当然也不忘有⾃⼰的细微思想在⾥⾯,写在这⾥主要是对⾃⼰由不懂到能独⽴写下来的纪念。

如有冒犯,还请原谅。

在接⼝IList中增加:void Insert(T item, int i);//在i后插void InsertBefore(T item, int i);//在i前插节点类和链表类参考前篇。

在链表类LinkList⾥⾯直接增加⽅法。

在第i个数前⾯插⼊:View Code1///<summary>2///插⼊数据到链表(i前插)3///</summary>4///<param name="item">插⼊的结点的数据</param>5///<param name="i">在第i个位置前插⼊结点</param>67public void InsertBefore(T item, int i)//i前插8 {9 LinkNode<T> node = this.head;10 LinkNode<T> nodeTemp; //临时结点11 LinkNode<T> InsertNode = new LinkNode<T>(item, null); //创建⼀个要插⼊的结点12if (this.head == null && i == 1) //空链表时,插⼊13 {14this.head = InsertNode;15return;16 }17if (i < 1 || i > this.GetLength() || (this.head == null && i != 1)) //异常下的处理18 {19 Console.WriteLine("Error,the location you want to insert in is wrong");20return;21 }2223if(this.head!=null&&i==1) //在第⼀个结点前插⼊24 {2526this.head=InsertNode;27 InsertNode.Next =node;28return;29 }3031//下⾯代码才是主要的,在第i个位置前⾯插⼊32int j = 1;33while(node!=null&j<i-1) //寻找第i-1个结点. i>=234 {35 node = node.Next;36 j++;37 }38 nodeTemp = node.Next;39 node.Next = InsertNode;40 InsertNode.Next = nodeTemp;4142 }在第i个数后⾯插⼊:View Code1///<summary>2///插⼊数据到链表(i后插)3///</summary>4///<param name="item">要插⼊的元素</param>5///<param name="i">在第i个位置的后⾯插⼊新节点</param>6public void Insert(T item, int i)7 {8 LinkNode<T> node=this.head;9 LinkNode<T> nodeTemp; //临时结点10 LinkNode<T> insertNode=new LinkNode<T>(item,null); //创建⼀个要插⼊的结点1112if (this.head == null && i == 1) //空链表时,插⼊13 {14this.head = insertNode;15return;16 }1718if (i < 1 || i > this.GetLength()||(this.head==null&&i!=1)) //异常下的处理19 {20 Console.WriteLine("Error,the location you want to insert in is wrong"); 21return;22 }2324if (i == this.GetLength()) //如果是在末尾插⼊, i〉=125 {26while (node.Next != null)27 {28 node = node.Next;29 }30 node.Next = insertNode;31return;32 }3334//下⾯代码才是主要的,在第i个位置后插⼊35int j = 1;36while (node != null && j < i)//寻找第i个结点. i>=237 {38 node = node.Next;39 j++;40 }41 nodeTemp = node.Next;42 node.Next = insertNode;43 insertNode.Next = nodeTemp;4445 }验证插⼊是否正确:View Code1static void Main(string[] args)2 {3 LinkList<int> MyList = new LinkList<int>();4 LinkNode<int> node = new LinkNode<int>();5 LinkList<int>.AddPosition HeadInsert = LinkList<int>.AddPosition.Head;67//验证插⼊元素8 MyList.Add(6, HeadInsert);9 MyList.Add(7, HeadInsert);10 MyList.Add(8, HeadInsert);1112 MyList.Insert(99, 2);13 MyList.InsertBefore(999, 2);1415 node = MyList.Head;16 node = PrintData(node);1718 Console.ReadLine();19 }2021private static LinkNode<int> PrintData(LinkNode<int> node)22 {23while (node != null)24 {25 Console.WriteLine("The data of List are:{0}", node.Data);26 node = node.Next;27 }28return node;29 }。

【头歌】单链表的基本操作

【头歌】单链表的基本操作

【头歌】单链表的基本操作
单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据元素和一个指向下一个节点的指针。

以下是单链表的基本操作:
1. 插入操作:在单链表的指定位置插入一个新节点。

具体步骤如下:
找到要插入的位置的前一个节点;
将新节点插入到前一个节点和当前节点之间;
修改新节点的指针,使其指向当前节点;
修改前一个节点的指针,使其指向新节点。

2. 删除操作:删除单链表中的指定节点。

具体步骤如下:
找到要删除的节点的前一个节点;
将前一个节点的指针指向要删除的节点的下一个节点;
释放要删除的节点的内存。

3. 查找操作:在单链表中查找指定元素。

具体步骤如下:
从头节点开始遍历单链表;
找到与指定元素相等的节点;
返回该节点的位置。

4. 遍历操作:从头节点开始,依次访问单链表中的每个节点。

具体步骤如下:创建一个指针指向头节点;
依次访问指针所指向的每个节点,直到指针为空。

5. 打印操作:打印单链表中的所有元素。

具体步骤如下:
创建一个指针指向头节点;
依次打印指针所指向的每个节点的数据元素,直到指针为空。

以上是单链表的基本操作,通过这些操作可以对单链表进行各种操作,如插入元素、删除元素、查找元素等。

数据结构代码(仅供参考)

数据结构代码(仅供参考)

线性表一、单链表操作(插入、删除):#include <stdio.h>#include <stdafx.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void InitList(LinkList &L){//初始化链表L,带表头结点L=(LinkList)malloc(sizeof(LNode));L->next=NULL;}//InitListvoid CreateList(LinkList &L,int n){//创建具有n个结点的链表,结点数据由键盘输入LinkList p;int i;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next;L->next=p;}//for}//CreateListvoid PrintList(LinkList &L){//打印结点的每个元素值LinkList p;p=L->next;printf("结点值分别为:\n");while(p){printf("%d ",p->data);p=p->next;}//whileprintf("\n");}//PrintListvoid InsertList(LinkList &L,int i,int n){//在的L的第i个位置插入元素nLinkList p,s;s=(LinkList)malloc(sizeof(LNode));int j=0;p=L;while(p&&j<i-1){p=p->next;j++;}//whileif(!p||j>i-1){printf("i的值不合法!\n");return;}//ifs->data=n;s->next=p->next;p->next=s;}//InsertListvoid Delete(LinkList &L,int i){//删除第i个元素LinkList P,Q;P=L;int j=0;while(P->next->next&&j<i-1){P=P->next;j=j+1;}if(!P->next) return;Q=P->next;P->next=Q->next;free(Q);}//Deletevoid main(){int n,i,j;LinkList L;printf("请输入链表结点个数:\n");scanf("%d",&n);InitList (L);printf("请逆序分别输入结点值:\n");CreateList(L,n);PrintList(L);printf("请输入擦人结点位置和值:\n"); scanf("%d%d",&i,&j);InsertList(L,i,j);PrintList(L);printf("请输入删除结点位置:\n");scanf("%d",&i);Delete(L,i);PrintList(L);}二、顺序表操作(插入、删除):#include "stdafx.h"#include <stdio.h>#include <malloc.h>#define InitListSize 100#define ListIncrement 10typedef struct {int *elem;int length;int LiskSize;}SqList;void InitList(SqList &L){//初始化顺序表LL.elem=(int *)malloc(InitListSize*sizeof(int));if(!L.elem){printf("分配失败!\n");return;}//ifL.length=0;L.LiskSize=InitListSize;}//InitListvoid InsertList(SqList &L,int i,int e){//在顺序表的第i个位置插入元素eif(i<1||i>L.length) {printf("i的位置不合法!");return;}//ifif(L.length+1>InitListSize){int *newbase;newbase=(int *)realloc(L.elem,(InitListSize+ListIncrement)*sizeof(int));if(!newbase){printf("分配失败!\n");return;}//ifL.elem=newbase;L.LiskSize =L.LiskSize +ListIncrement;}//ifint *p,*q;q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;p--)*(p+1)=*p;*q=e;L.length +=1;}//InsertListvoid DeleteList(SqList &L,int i,int &e){//删除顺序表的第i个位置的值,并用e返回if(i<1||i>L.length) {printf("i的位置不合法!");return;}//ifint *p,*q;q=&(L.elem[i-1]);e=*q;p=&(L.elem[L.length-1]);for(q=q+1;q<=p;q++)*(q-1)=*q;--L.length;}//DeleteListvoid PrintList(SqList L){//打印顺序表中的所有元素int i;for(i=0;i<=L.length-1;i++)printf("%d ",L.elem[i]);printf("\n");}void main(){int i,n;int p,q;SqList L;InitList(L);printf("请输入元素的个数:\n");scanf("%d",&n);printf("请分别输入各个链表元素:\n");for(i=0;i<n;i++){scanf("%d",&(L.elem[i]));}//forL.length=5;PrintList(L);printf("请输入擦人元素的位置和值:\n");scanf("%d%d",&p,&q);InsertList(L,p,q);PrintList(L);printf("请输入删除元素的位置:\n");scanf("%d",&p);DeleteList(L,p,q);PrintList(L);}三、顺序表操作(合并、交集(另辟空间)、交集(用表A空间)):#include "stdafx.h"#include <stdio.h>#include <malloc.h>#define InitListSize 100#define ListIncrement 10typedef struct {int *elem;int length;int LiskSize;}SqList;void InitList(SqList &L){//初始化顺序表LL.elem=(int *)malloc(InitListSize*sizeof(int));if(!L.elem){printf("分配失败!\n");return;}//ifL.length=0;L.LiskSize=InitListSize;}//InitListvoid CreateList(SqList &L){//int n,i;printf("请输入元素的个数:\n");scanf("%d",&n);printf("请分别输入各个链表元素:\n");for(i=0;i<n;i++){scanf("%d",&(L.elem[i]));}//forL.length=n;}void InsertList(SqList &L,int e){//在顺序表的结尾插入元素eif(L.length+1>InitListSize){int *newbase;newbase=(int *)realloc(L.elem,(InitListSize+ListIncrement)*sizeof(int));if(!newbase){printf("分配失败!\n");return;}//ifL.elem=newbase;L.LiskSize =L.LiskSize +ListIncrement;}//ifL.elem[L.length]=e;L.length +=1;}//InsertListvoid PrintList(SqList L){//打印顺序表中的所有元素int i;for(i=0;i<=L.length-1;i++)printf("%d ",L.elem[i]);printf("\n");}void Merge(SqList La,SqList Lb,SqList &Lc){//La与Lb都递增,合并后的Lc也递增int *pa,*pb,*pc,*palast,*pblast;pa=La.elem;pb=Lb.elem;Lc.LiskSize=Lc.length=La.length+Lb.length;pc=Lc.elem=(int *)malloc(Lc.LiskSize*sizeof(int));if(!Lc.elem) return;palast=La.elem+La.length-1;pblast=Lb.elem+Lb.length-1;while(pa<=palast&&pb<=pblast){if(*pa<*pb) *pc++=*pa++;else *pc++=*pb++;}//whilewhile(pa<=palast) *pc++=*pa++;while(pb<=pblast) *pc++=*pb++;}//mergevoid InterSet(SqList La,SqList Lb,SqList &Ld){//顺序表合并,另辟空间为Ld,可以有相同元素InitList(Ld);int i,j=0;for(i=0;i<La.length;i++){while(Lb.elem[j]<=La.elem[i]&&j<Lb.length){if(Lb.elem[j]==La.elem[i]) InsertList(Ld,La.elem[i]);j=j+1;}}//for}//InterSetvoid DeleteList(SqList &L,int i){//删除顺序表L.elem[i]if(i<0||i>=L.length) {printf("i的位置不合法!");return;}//ifint *p,*q;q=&(L.elem[i-1]);p=&(L.elem[L.length-1]);for(q=q+1;q<=p;q++)*(q-1)=*q;--L.length;}//DeleteListvoid InterSet2(SqList &La,SqList Lb){int e,i,j=0;for(i=0;i<La.length;i++){if(i>1&&La.elem[i]==La.elem[i-1]) La.elem[i]=0;else{e=0;while(j<Lb.length&&Lb.elem[j]<=La.elem[i]){if(La.elem[i]=Lb.elem[j]) e=1; //出现相同元素标志j=j+1;}if(e==0) La.elem[i]=0; //未出现相同元素}//if}//fori=0;while(i<La.length){if(La.elem[i]==0){DeleteList(La,i);i=i-1; //因为删除,后面元素已经迁移}i=i+1;}//while}//InterSet2void main(int argc, char* argv[]){SqList La,Lb,Lc,Ld;InitList(La);InitList(Lb);CreateList(La);CreateList(Lb);Merge(La,Lb,Lc);printf("合并后为:\n");PrintList(Lc);InterSet(La,Lb,Ld);printf("交集为:\n");PrintList(Ld);InterSet2(La,Lb);printf("求交集,(用La的空间存放)为:\n");PrintList(La);}四、链表逆序合并,允许有相同值:#include "stdafx.h"#include <malloc.h>#define N 5 //假设每个链表有五个元素typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L){//创建链表LLinkList P,Q;int i;L=(LinkList)malloc(sizeof(LNode));P=L;printf("请输入链表元素,共5个:\n");for(i=0;i<N;i++){Q=(LinkList)malloc(sizeof(LNode));scanf("%d",&Q->data);P->next=Q;P=P->next;}//forP->next=NULL;}//CreateListvoid Merge(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList Pa,Pb,Pc,Q;Pa=La->next;Pb=Lb->next;Pc=Lc=La;Pc->next=NULL;while(Pa&&Pb){if(Pa->data<=Pb->data){Q=Pa;Pa=Pa->next;Q->next=Pc->next;Pc->next=Q;}else{Q=Pb;Pb=Pb->next;Q->next=Pc->next;Pc->next=Q;}}//whileif(Pa){while(Pa){Q=Pa;Pa=Pa->next;Q->next=Pc->next;Pc->next=Q;}}else{while(Pb){Q=Pb;Pb=Pb->next;Q->next=Pc->next;Pc->next=Q;}}free(Lb);}//Mergevoid Print(LinkList L){//打印链表中所有元素LinkList P;P=L->next;while(P){printf("%d",P->data);P=P->next;}printf("\n");}//Printvoid main(int argc, char* argv[]){LinkList a,b,c;CreateList(a);CreateList(b);Merge(a,b,c);printf("a and b inverse merge is:\n");Print(c);}五、链表求交集:#include "stdafx.h"#include <malloc.h>#define N 5 //假设每个链表有五个元素typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L){//创建链表LLinkList P,Q;int i;L=(LinkList)malloc(sizeof(LNode));P=L;printf("请输入链表元素,共5个:\n");for(i=0;i<N;i++){Q=(LinkList)malloc(sizeof(LNode));scanf("%d",&Q->data);P->next=Q;P=P->next;}//forP->next=NULL;}//CreateListvoid InterSet(LinkList La,LinkList Lb,LinkList &Lc){ //交集为Lc,另辟空间LinkList Pa,Pb,Pc,Q;Pa=La->next;Pb=Lb->next;Lc=(LinkList)malloc(sizeof(LNode));Pc=Lc;while(Pa){while(Pb&&Pb->data<=Pa->data){if(Pb->data==Pa->data){Q=(LinkList)malloc(sizeof(LNode));Q->data=Pb->data;Pc->next=Q;Pc=Pc->next;}//ifPb=Pb->next;}//whilePa=Pa->next;}//whilePc->next=NULL;}//InterSetvoid InterSet2(LinkList La,LinkList Lb,LinkList &Lc){ //利用a表空间进行交集(不可以出现相同元素)LinkList Q;LinkList Pa,Pb,Pc;Pc=Lc=La;Pa=La->next;Pb=Lb->next;while(Pa){if(!Pc->data||Pa->data!=Pc->data){while(Pb&&Pb->data<=Pa->data){if(!Pc->data||Pc->data!=Pb->data){//Pc中不存在与Pb相同的元素Pc->next=Pa;Pc=Pc->next;}Pb=Pb->next;}//while}//ifif(!Pc->data||Pc->data!=Pa->data){ //此结点没有取Q=Pa;Pa=Pa->next;free(Q);}else{Pa=Pa->next;}//if}//whilePc->next=NULL;}//InterSet2void Print(LinkList L){//打印链表中所有元素LinkList P;P=L->next;while(P){printf("%d ",P->data);P=P->next;}printf("\n");}//Printvoid main(int argc, char* argv[]){LinkList a,b,c,d;CreateList(a);CreateList(b);InterSet(a,b,c);printf("a and b 另辟空间交集(可以出现相同元素) is:\n");Print(c);InterSet2(a,b,d);printf("a and b 利用a表空间进行交集(不可以出现相同元素)is:\n");Print(d);}六、顺序表逆向求交集(真题:0501):#include "stdafx.h"#include <stdio.h>#include <malloc.h>#define Initsize 100#define Increment 10typedef struct {int *elem;int length;int Listsize;}SqList;int N=5; //假设顺序表中各有五个元素void InitList(SqList &L){L.elem=(int*)malloc(Initsize*sizeof(int));if(!L.elem) return;L.length=0;L.Listsize=Initsize;}//InitListvoid CreateList(SqList &L){int i;char c;for(i=0;i<N;i++){scanf("%d",&L.elem[i]);c=getchar();L.length++;}}//CreateListvoid InsertList(SqList &L,int e){if(L.length>=L.Listsize){int *newbase;newbase=(int*)realloc(L.elem,(Initsize+Increment)*sizeof(int));L.elem=newbase;}//ifL.elem[L.length]=e;L.length++;}//InsertListvoid Print(SqList L){int i;for(i=0;i<L.length;i++)printf("%d ",L.elem[i]);}//Printvoid Interset(SqList A,SqList B){SqList C;InitList(C);int i,j;j=B.length-1;for(i=A.length-1;i>=0;i--){while(B.elem[j]>=A.elem[i]){if(B.elem[j]==A.elem[i]){InsertList(C,B.elem[j]);}j=j-1;}//while}//forprintf("逆向合并后的元素为:\n");Print(C);}//Intersetvoid main(int argc, char* argv[]){SqList A,B;InitList(A);InitList(B);printf("请输入顺序表A元素(5ge):\n");CreateList(A);printf("请输入顺序表B元素(5ge):\n");CreateList(B);Interset(A,B);printf("\n");}七、单链表元素反向逆置(真题:0502):#include "stdafx.h"#include <stdio.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;int n;void CreateList(LinkList &L){LinkList P,Q;int i;L=(LinkList)malloc(sizeof(LNode));P=L;char c;for(i=0;i<n;i++){Q=(LinkList)malloc(sizeof(LNode));scanf("%d",&Q->data);c=getchar();P->next=Q;P=P->next;}//forP->next=NULL;}void InverseList(LinkList &L){LinkList P,Q;P=L->next;L->next=NULL;while(P){Q=P;P=P->next;Q->next=L->next;L->next=Q;}//while}void PrintList(LinkList L){LinkList p;p=L->next;while(p){printf("%d \n",p->data);p=p->next;}}void main(int argc, char* argv[]){LinkList L;printf("请输入链表元素个数:\n");scanf("%d",&n);printf("请输入链表元素:\n");CreateList(L);InverseList(L);printf("反向逆置后的链表元素为:\n");PrintList(L);}八、指定结点与后一个结点交换(真题0703):#include "stdafx.h"#include <stdio.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;int n; //链表元素个数void Exchange(LinkList &L,LinkList P){//将P所指的元素与其后一个元素进行交换LinkList Q;Q=L;while(Q->next!=P) Q=Q->next;Q->next=P->next;P->next=Q->next->next;Q->next->next=P;}//Exchangevoid CreateList(LinkList &L){//构造链表LinkList P,Q;int i;L=(LinkList)malloc(sizeof(LNode));P=L;for(i=0;i<n;i++){Q=(LinkList)malloc(sizeof(LNode));scanf("%d",&Q->data);P->next=Q;P=P->next;}//forP->next=NULL;}//CreateListvoid PrintList(LinkList &L){//打印链表所有元素LinkList P;P=L->next;while(P){printf("%d ",P->data);P=P->next;}}//PrintListvoid main(int argc, char* argv[]){LinkList List,P;printf("请输入链表元素个数:\n");scanf("%d",&n);printf("请输入链表元素:\n");CreateList(List);P=List->next->next->next; //假设p指向第三个结点Exchange(List,P);printf("P(假设指向第三个结点)与后一个结点交换后链表元素为:\n");PrintList(List);printf("\n");}九、静态链表(真题:0806):#include "stdafx.h"#include <malloc.h>#define MAXSIZE 11typedef struct{int data; //存储数据int cur;}component,SLinkList[MAXSIZE];void InitSpace_SL(SLinkList &space){//将一维数组space中各分量连成一个备用链表,space[0].cur为头指针,//“0”表示空指针int i;for(i=0;i<MAXSIZE-1;++i) space[i].cur=i+1;space[MAXSIZE-1].cur=0;}//InitSpace_SLint Malloc_SL(SLinkList &space){//若备用空间链表非空,则返回分配的结点下标,否则返回0int i;i=space[0].cur;if(space[0].cur) space[0].cur=space[i].cur;return i;}//Malloc_SLvoid print(SLinkList space,int s){int i;printf("元素为:\n");for(i=space[s].cur;i<space[0].cur;i++){printf("%d",space[i].data);}//forprintf("\n");}//printvoid Free_SL(SLinkList &space,int k){//将下标为k的空闲结点回收到备用链表space[k].cur=space[0].cur;space[0].cur=k;}//Free_SLvoid Difference(SLinkList &space){//依次输入集合A与B的元素,在一维数组space中建立(A-B)U(B-A)//的静态链表,s为其头指针。

单链表的基本操作实验问题与对策

单链表的基本操作实验问题与对策

【单链表的基本操作实验问题与对策】01. 简介在计算机科学领域,数据结构是学习和理解的重要基础,而单链表作为其中的一种基本数据结构,在学习过程中通常需要进行一些操作实验。

然而,很多学生在进行单链表的基本操作实验时会遇到一些问题,本文将对这些问题进行全面评估,并提出对策,帮助读者更好地理解和掌握单链表的基本操作。

02. 常见问题在进行单链表的基本操作实验时,学生常常会遇到以下一些问题:- 对单链表的基本概念理解不深:学生可能对单链表的定义、结构和操作方法理解不够透彻,导致在实验中无法正确编写相关代码。

- 插入、删除和查找操作的实现困难:学生在实验中往往会遇到关于单链表插入、删除和查找等操作的实现困难,无法正确理解和编写相关算法。

03. 对策建议针对上述问题,本文提出以下对策建议:- 加强基础知识的学习:在进行单链表操作实验之前,学生首先应加强对单链表的基本概念的学习,包括单链表的定义、结构、操作方法等,以确保对单链表有一个清晰透彻的理解。

- 多实践、多编程:学生在进行实验的过程中,应多进行实践操作,多编写单链表操作的相关代码,熟练掌握插入、删除和查找等操作的实现方法,加深对单链表操作的理解和掌握。

- 多思考、多讨论:在实验中,学生还应不断思考和讨论单链表操作的相关问题,尝试寻找不同的解决方法和思路,加深对单链表操作问题的理解和掌握。

04. 个人观点和理解对于单链表的基本操作问题,我个人认为加强基础知识的学习是至关重要的,只有对单链表的基本概念有一个清晰透彻的理解,才能更好地解决在实验中遇到的各类问题。

多实践、多编程也是非常重要的,只有通过不断的实践操作和编写代码,才能更好地掌握单链表的基本操作,提高解决问题的能力和水平。

总结通过对单链表的基本操作实验问题的全面评估,并提出对策建议,希望能帮助学生更好地理解和掌握单链表的基本操作,提高实验的效果和水平。

至此,我们共享了解单链表的基本操作实验问题和对策建议,希望对您有所帮助。

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

c=getchar();
if(c!='\n')
{
s=(LinkList)malloc(sizeof(LNode));//为读入的字符分配存储空间
s->data=c;
r->next=s;
r=s;
}
else
pre=L;
k=0;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(k!=i-1)
{
printf("插入位置不合理!");
return 0;
}
s=(LinkList)malloc(sizeof(LNode));
{
flag=0;
r->next=NULL;
}
}
return L;
}
int InsList(LinkList L,int i,char e)//在带头节点的单链表L中第i个位置插入值为e的新结点
{
LinkList pre,s;
int k;
char c;
int flag=1;//设置变量flag,当输入'\n',将flag置为0,建表结束
L=(LinkList)malloc(sizeof(LNode));//为头结点分配存储空间
L->next=NULL;
r=L;
while(flag)
{
printf("输入链表各结点的数据:\n");
L=GreatList();//建立链表
printf("\n请输入要插入节点的值和要插入的值(注意用空格隔开): \n");
scanf("%d %c",&i,&g);
j=InsList(L,i,g);
if(j)
printf("插入失败");
getch();
}
s->data=e;//将待插入结点的值e赋给s的数据域
s->next=pre->next;//完成插入操作
pre->next=s;
return 1;
}
void main()
{
LinkList L;
LNode *k;
int i,j; char g { printf("\n插入成功,插入后的序列为:\n");
k=L->next;
while(k!=NULL)
{
printf("%c ",k->data);
k=k->next;
}
}
else
#include "stdio.h"
typedef struct node
{
char data;
struct node *next;
}LNode,*LinkList;
LinkList GreatList()
{
LinkList L;
LNode *s,*r;
相关文档
最新文档