单链表的插入

合集下载

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

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

单链表查找插⼊删除算法时间效率分析单链表查找时间效率分析:
代码:
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;}```(二)单链表的插入操作单链表的插入操作可以分为在表头插入、在表尾插入和在指定位置插入。

链表:单链表插入和删除一个节点的伪代码算法

链表:单链表插入和删除一个节点的伪代码算法

链表:单链表插⼊和删除⼀个节点的伪代码算法⼀.删除节点:如果链表长度为0,则退出;反之,如果要删除的元素为头节点,则将头节点移⾄下⼀个节点;如果要删除的元素为末节点,则将末节点移⾄上⼀个节点;反之,则将第i-1个元素指针域指向第i+1个元素;释放已删除节点的内存,返回。

struct link DeleteNode (struct link head, int nodeData)struct link p = head, pr = headif (head == NULL)return 0elsewhile (nodeData != p->data)pr = pp = p->nextif (p == head)head = p->nextelsepr->next = p->nextfree(p)return 0⼆.插⼊节点:如果链表长度为0,则将新节点作为头节点;反之,如果要插⼊的位置为头节点前,则将头节点的指针域指向头节点;如果要插⼊的位置为末节点后,则将末节点的指针域指向新节点;反之,将将新节点的指针域之下⼀节点,且让前⼀节点的指针域指向新节点。

struct link InsertNode(struct link head, int nodeData)struct link p = head, pr = head,temp = NULLif (head == NULL)head = pelsewhile (nodeData != p->data)temp = prpr = pr->nextif (pr == head)p->next = headhead = pelsepr = temp;p->next = pr->nextpr->next = pelse (pr==terminal node)pr->next = preturn 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. 单链表的删除单链表的删除可以分为在链表头部删除、在链表尾部删除和在链表中间删除三种情况。

单链表的建立、插入和删除

单链表的建立、插入和删除

单链表的建立、插入和删除单链表的建立插入删除#include<stdio.h>#include<stdlib.h>/*线性表*/struct TLink {int data;struct TLink * next;};/*end struct TLink*//*生成新元素*/struct TLink * new_item(int number){struct TLink * r = 0;r = (struct TLink *)malloc(sizeof(struct TLink));r->data = number;r->next = 0;return r;}/*end new_item*//*在线性表中查询数据*/struct TLink * lookup(struct TLink * root, int number) {struct TLink * h = root;while(h) {if (h->data == number) return h;h = h->next ;}/*end lookup*/return 0;}/*在线性表中追加一个数据*/void append(struct TLink * * root, int number){struct TLink * r = 0, * n = 0;if (!root) return ;/*不记录重复元素*/if (lookup(*root, number)) return;/*如果表为空则新建表*/r = *root;if (!r) {*root = new_item(number);return ;}/*end if*//*为保证为有序线性表,如果数据比表头还小则作为表头*/ if (number < r->data ) {n = new_item(number);n->next = r;*root = n;return ;}/*end if*//*在有序线性表中查找位置插入元素*/while(r) {n = r->next ;/*如果已经是表尾则直接追加*/if (!n) {n = new_item(number);r->next = n;return ;}/*end if*//*在中央某处插入*/if (number < n->data ) {r->next = new_item(number);r->next->next = n;return ;}/*end if*/r = n;}/*end while*/}/*end append*//*打印有序线性表*/void print(struct TLink * root){struct TLink * r = root;printf("【");while(r) {printf("%d ", r->data );r = r->next ;}/*end while*/printf("\b】\n");}/*end print*//*将有序线性表h1合并至有序线性表h0,并销毁线性表h1*/ void merge(struct TLink ** h0, struct TLink ** h1){struct TLink * h = 0, * k = 0;if (!h0 || !h1) return ;h = *h1;while(h) {append(h0, h->data );k = h;h = h->next ;free(k);}/*end h*/h1 = 0;}int main(void){int i = 0; struct TLink * x=0, *y = 0;int a[] = {8,4,3,9,5,1};int b[] = {7,2,1,5,6,0};printf("原数据为:\n数组A:【");for(i = 0; i < 6; i++) {printf("%d ", a[i]);append(&x, a[i]);}/*next*/printf("\b】\n数组B:【");for(i = 0; i < 6; i++) {printf("%d ", b[i]);append(&y, b[i]);}/*next*/printf("\b】\n转换为有序线性表\nA:");print(x);printf("B:");print(y);printf("AB合并后为:");merge(&x, &y);print(x);return 0;}。

写出在单链表中某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.掌握单链表的基本操作,如插入、删除、遍历等。

4.通过实验,加深对理论知识的理解,提高编程能力。

二、实验内容1.实验原理:单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据域和指针域。

其中,指针域指向下一个节点,最后一个节点的指针域指向空。

单链表的主要操作包括插入、删除、遍历等。

2.实验步骤:(1)创建一个单链表。

(2)实现插入操作,即在链表的末尾插入一个新节点。

(3)实现删除操作,即删除链表中的一个指定节点。

(4)实现遍历操作,即输出链表中所有节点的数据。

3.实验代码:下面是使用Python语言实现的单链表及其基本操作的示例代码。

class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef insert(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next is not None:current = current.nextcurrent.next = new_nodedef delete(self, data):if self.head is None:returnif self.head.data == data:self.head = self.head.nextreturncurrent = self.headwhile current.next is not None and current.next.data != data:current = current.nextif current.next is None:returncurrent.next = current.next.nextdef traverse(self):current = self.headwhile current is not None:print(current.data)current = current.next4.实验结果:通过运行上述代码,我们可以看到单链表的基本操作得到了实现。

单链表的插入算法

单链表的插入算法

单链表的插入算法单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。

在单链表中,插入操作是一种常见的操作,它允许在指定位置插入一个新的节点。

本文将介绍单链表的插入算法,并给出示例代码。

一、插入算法的思路单链表的插入算法主要包括以下几个步骤:1. 创建一个新的节点,将待插入的数据赋值给该节点的数据域。

2. 找到插入位置的前一个节点,即待插入节点的前驱节点。

3. 将前驱节点的指针域指向新节点,新节点的指针域指向原来前驱节点的下一个节点。

4. 插入完成。

二、插入算法的实现代码下面是一个使用C语言实现的单链表插入算法的示例代码:```#include <stdio.h>#include <stdlib.h>// 定义单链表的节点结构struct Node {int data;struct Node* next;};// 插入节点的函数void insertNode(struct Node* head, int position, int value) {// 创建新节点struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = value;// 找到插入位置的前一个节点struct Node* temp = head;for (int i = 0; i < position - 1; i++) {if (temp == NULL) {printf("插入位置无效\n");return;}temp = temp->next;}// 插入新节点newNode->next = temp->next;temp->next = newNode;}// 打印链表的函数void printList(struct Node* head) {struct Node* temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");}int main() {// 创建头节点struct Node* head = (struct Node*)malloc(sizeof(struct Node));head->next = NULL;// 插入节点insertNode(head, 0, 1);insertNode(head, 1, 3);insertNode(head, 1, 2);insertNode(head, 3, 4);// 打印链表printList(head->next);return 0;}```三、插入算法的示例运行结果上述代码中,我们插入了四个节点,分别是1、2、3、4。

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

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

实验二 单链表的插入和删除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 }。

数据结构之单链表头插法,尾插法

数据结构之单链表头插法,尾插法

数据结构之单链表头插法,尾插法数据结构之单链表头插法,尾插法单链表是中的⼀种,单链表的头插法也称前插法。

链表也是线性表的⼀种,与顺序表不同的是,它在内存中不是连续存放的。

在C语⾔中,链表是通过指针相关实现的。

⽽单链表是链表的其中⼀种,关于单链表就是其节点中有数据域和只有⼀个指向下个节点的指针域。

创建单链表的⽅法有两种,分别是头插法和尾插法。

所谓头插法,就是按节点的逆序⽅法逐渐将结点插⼊到链表的头部。

反之尾插法就是按节点的顺序逐渐将节点插⼊到链表的尾部。

相对来说,头插法要⽐尾插法算法简单,但是最后产⽣的链表是逆序的,即第⼀个输⼊的节点实际是链表的最后⼀个节点。

⽽为了习惯,通常⽤尾插法来创建链表。

下⾯的代码就是实现了头插法和尾插法创建头节点//创建头结点Node* Create_List (){//创建头结点Node* list = (Node*) malloc(sizeof(Node) / sizeof(char));if (NULL == list) //检验创建是否成功{return FALSE;}list->next = NULL;return list;}头插法// 头插法int Insert_Last (Node* h, LinkData data){// 判断数据传⼊是否正确if (NULL == h){return FALSE;}// 创建新结点并判断创建是否成功Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));if (NULL == node){return FALSE;}// 给结点成员变量赋值node->data = data;node->next = h->next; // 和头指针的不同:node->next = *h;// 让新结点变为链表的第⼀个节点h->next = node;return TRUE;}尾插法//尾插int Insert_Last(Node* h, LinkData data){if (NULL == h){return FALSE;}// 创建新结点并判断创建是否成功Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));if (NULL == node){return FALSE;}// 给结点成员变量赋值node->data = data;node->next = NULL;// 让新结点变为链表的最后⼀个节点Node* tmp = h;while(tmp->next){tmp = tmp->next;}//找到链表的尾节点并令尾节点指向nodetmp->next = node;return TRUE;}扩充中间插⼊//中间插⼊法int Insert_Pos(Node *h, int pos, LinkData data){//判断链表是否存在if (NULL == h){return FALSE;}Node* tmp = h;int i;for (i = 0; i < pos - 1; i++){if (NULL == tmp){break;}tmp = tmp->next;}//判断tmp是否存在if (NULL == tmp){printf ("插⼊位置越界");return FALSE;}Node* node = (Node*) malloc(sizeof(Node) / sizeof(char)); if (NULL == node){return FALSE;}node->data = data;node->next = tmp->next;tmp->next = node;return TRUE;}。

单链表的基本操作代码

单链表的基本操作代码

单链表的基本操作代码单链表是一种常用的数据结构,它具有优秀的插入和删除性能,在数据存储和处理方面具有广泛的应用。

单链表的基本操作包含创建链表、插入节点、删除节点、查找节点等,下面是单链表的基本操作代码:1. 定义单链表结构体:typedef struct ListNode {int val;struct ListNode *next;} ListNode;2. 创建单链表:ListNode *createList(int arr[], int n) {ListNode *head = NULL, *tail = NULL, *p = NULL;for(int i = 0; i < n; i++) {p = (ListNode *)malloc(sizeof(ListNode));p->val = arr[i];p->next = NULL;if(head == NULL) {head = tail = p;} else {tail->next = p;tail = p;}}return head;}3. 插入节点:void insertNode(ListNode **head, int val, int pos) {ListNode *p = (ListNode *)malloc(sizeof(ListNode)); p->val = val;p->next = NULL;if(*head == NULL) {if(pos != 0) {printf("Invalid position\n");return;} else {*head = p;return;}}if(pos == 0) {p->next = *head;*head = p;} else {int i = 0;ListNode *q = *head;while(q != NULL && i < pos - 1) {q = q->next;i++;}if(q == NULL || i != pos - 1) {printf("Invalid position\n");return;}p->next = q->next;q->next = p;}}4. 删除节点:void deleteNode(ListNode **head, int pos) {if(*head == NULL) {printf("List is empty\n");return;}if(pos == 0) {ListNode *p = *head;*head = (*head)->next;free(p);} else {int i = 0;ListNode *p = *head, *q = NULL; while(p != NULL && i < pos) { q = p;p = p->next;i++;}if(p == NULL || i != pos) {printf("Invalid position\n");return;}q->next = p->next;free(p);}}5. 查找节点:ListNode *findNode(ListNode *head, int val) {ListNode *p = head;while(p != NULL) {if(p->val == val) {return p;}p = p->next;}return NULL;}单链表的基本操作是数据结构中最基础的部分,掌握好这些代码对于往后的学习和应用都会有很大的帮助。

单链表的插入

单链表的插入

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

单链表-尾插法

单链表-尾插法

单链表-尾插法
尾插法:元素插⼊在链表尾部,也叫尾插法。

①从⼀个空表L开始,将新节点逐个插⼊到链表的尾部,尾指针 r 指向链表的尾结点
②初始时,r同L均指向头结点。

每读⼊⼀个数据元素,则申请⼀个新节点,将新节点插⼊到尾结点后,r指向新节点。

p->data = ai;
p->next = NULL;
r->next = p;
r = p;
// 正位序输⼊n个元素的值,建⽴带表头结点的单链表L
// L⽤来存储建好的链表,届时返回这个链表
// n 代表链表元素的个数
void CreateList_R(LinkList &L, int n){
L = new Lnode;
L ->next = NULL;
r = L; //尾指针 r 指向头结点
for(i=0 ; i<n ; ++i){
// 从内存空间中申请⼀块空间,⽤指针变量p指向这块⼉空间
p = new Lnode;
// 然后输⼊ data 域的值。

⽣成新节点,输⼊元素值
cin >> p->data;
p -> next = NULL;
// 给尾指针的 next 域赋值,赋的是新开辟好的结点
r -> next = p; // 插⼊到表尾
r = p; // 尾指针 r 指向新结点
}
}。

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

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