单链表之尾部插入节点

合集下载

单链表-尾插法

单链表-尾插法

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

①从⼀个空表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 指向新结点
}
}。

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

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

链表:单链表插⼊和删除⼀个节点的伪代码算法⼀.删除节点:如果链表长度为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三.参考资料:。

数据结构 单链表基本操作代码

数据结构 单链表基本操作代码

数据结构单链表基本操作代码```一、单链表基本概念单链表是一种常见的线性存储结构,由一系列节点组成。

每个节点包括数据域和指针域,数据域存储具体的数据,指针域指向下一个节点。

二、单链表基本操作2.1 创建链表创建一个空链表,即没有任何节点。

可以选择初始化一个头节点,也可以直接初始化为空。

2.2 在链表头部插入节点在链表头部插入新节点。

将新节点的指针域指向原头节点,然后更新头节点指针,使其指向新节点。

2.3 在链表尾部插入节点在链表尾部插入新节点。

遍历链表找到尾节点,然后将尾节点的指针域指向新节点。

2.4 在指定位置插入节点在链表的指定位置插入新节点。

遍历链表找到指定位置的节点,然后将新节点的指针域指向下一个节点,再将指定位置的节点的指针域指向新节点。

2.5 删除链表头节点删除链表头节点,即将头节点的指针指向下一个节点,然后删除原头节点。

2.6 删除链表尾节点删除链表尾节点,即遍历链表找到尾节点的上一个节点,将其指针域置空,然后删除尾节点。

2.7 删除指定位置的节点删除链表的指定位置节点,即遍历链表找到指定位置节点的上一个节点,将其指针域指向下一个节点,然后删除指定位置节点。

2.8查找链表中是否存在某个元素遍历链表,逐个比较节点的数据域与目标元素,直到找到匹配或遍历到链表末尾。

2.9获取链表长度遍历链表,计数节点的个数,直到遍历到链表末尾。

三、附件暂无附件。

四、法律名词及注释本文档未涉及任何法律名词及其注释。

```。

单链表的头插法和尾插法c语言实现

单链表的头插法和尾插法c语言实现

单链表的头插法和尾插法c语⾔实现/*单链表的头插法和尾插法c语⾔实现*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*简单的定义⼀个链表节点的数据单元*/typedef struct student_t{int num;char name[SIZE];struct student_t* pNext;}studentList, *pStudentList;/*定义⼀个全局的静态的链表头节点指针*/static pStudentList g_pstStudentList = NULL;/*创建⼀个学⽣信息的链表节点*/pStudentList createaOneStudentListNode(){pStudentList pNewNode = NULL;pNewNode = (pStudentList)malloc(sizeof(studentList));return pNewNode;}/*在链表头插⼊数据节点*/int addOneStudentToListHead(int num, char* name){pStudentList pNewNode = NULL;int result = 0;if ((num < 0) || (name == NULL)){result = -1;printf("error inoput parameter!\n");return result;}pNewNode = createaOneStudentListNode();pNewNode->num = num;memcpy(pNewNode->name, name, strlen(name));pNewNode->pNext = g_pstStudentList;g_pstStudentList = pNewNode;return result;}/*在链表尾部插⼊数据节点*/int addOneStudentToListTail(int num, char* name){pStudentList pTempHead = NULL;pStudentList pTailNode = NULL;pStudentList pNewNode = NULL;int result = 0;if ((num < 0) || (name == NULL)){result = -1;printf("error input parameter!\n");return result;}pTempHead = g_pstStudentList;while(pTempHead){if (pTempHead->pNext == NULL){pTailNode = pTempHead;}pTempHead = pTempHead->pNext;}pNewNode = createaOneStudentListNode();pNewNode->num = num;memcpy(pNewNode->name, name, strlen(name));pNewNode->pNext = NULL;pTailNode->pNext = pNewNode;return result;}/*输出整个链表中的学号信息,检查插⼊的是否正确,插⼊时没有考虑是否有相同学号*/ void printList(){pStudentList pTempHead = NULL;pTempHead = g_pstStudentList;while(pTempHead){printf("studnet num = %d\n", pTempHead->num);pTempHead = pTempHead->pNext;}}/*释放整个链表的资源*/void freeList(){pStudentList pTempHead = NULL;pStudentList pFree = NULL;int i = 0;pTempHead = g_pstStudentList;pFree = g_pstStudentList;while(pTempHead){pFree = pTempHead;printf("free studnet num = %d\n", pTempHead->num);pTempHead = pTempHead->pNext;if (pFree != NULL){printf("i = %d\n", i);/*测试是否正确释放资源*/free(pFree);}++i;}}int main(){/*构建头节点*/char* cName = "allan";g_pstStudentList = createaOneStudentListNode();g_pstStudentList->num = 0;memcpy(g_pstStudentList->name, cName, strlen(cName));g_pstStudentList->pNext = NULL;/*使⽤尾插法插⼊数据*/char* cName1 = "allan1";addOneStudentToListTail(1,cName1);/*使⽤尾插法插⼊数据*/char* cName2 = "allan2";addOneStudentToListTail(2,cName2);/*使⽤头插法插⼊数据*/char* cName3 = "allan3";addOneStudentToListHead(3,cName3);/*输出当前链表中存储的学号,没有考虑学号的唯⼀性,假设输⼊的都是不同数字*/ printList();/*使⽤完资源后进⾏释放资源,防⽌内存泄漏*/freeList();return 0;}使⽤VS2008运⾏结果如下图所⽰:。

使用单链表的总结

使用单链表的总结

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

以下是使用单链表的一些关键总结:1. 基本结构:-单链表的节点包含两个部分:数据域和指针域。

-数据域存储节点的值。

-指针域存储指向下一个节点的引用。

2. 头节点:-单链表的头节点是链表的入口,用于引导整个链表。

-头节点通常不包含有效数据,只是用于指向第一个包含数据的节点。

3. 插入操作:-在链表头部插入节点是一种常见的操作,称为头插法。

-在链表尾部插入节点也是一种常见的操作,称为尾插法。

-在链表中间插入节点需要调整前后节点的引用。

4. 删除操作:-删除链表中的节点需要调整前后节点的引用,确保链表的连续性。

-删除头节点和中间节点的操作方式不同。

5. 遍历操作:-遍历链表是查看链表中所有元素的常见方式。

-可以使用循环或递归进行链表的遍历操作。

6. 链表的优势:-相比于数组,链表的插入和删除操作更为高效,不需要移动大量元素。

-链表的大小可以动态变化,不需要预先分配空间。

7. 链表的劣势:-链表访问元素的时间复杂度为O(n),而数组是O(1)。

-链表需要额外的内存空间存储指针。

8. 循环链表:-在单链表的基础上,尾节点的指针指向头节点,形成一个循环结构。

9. 双向链表:-每个节点包含两个指针,分别指向前一个节点和后一个节点,提供了双向遍历的能力。

10. 应用场景:-单链表常用于需要频繁插入和删除操作的场景,如LRU缓存算法、图的邻接表表示等。

总体而言,单链表是一种简单而灵活的数据结构,能够有效地应用于特定的问题领域,特别是在涉及频繁插入和删除操作时。

了解链表的基本特性和操作是编写高效代码的重要一环。

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,最后返回新节点的指针。

pta 单链表基本操作

pta 单链表基本操作

pta 单链表基本操作
单链表是一种常见的数据结构,由一个个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

基本操作包括以下几种:
1. 创建链表:创建一个空链表,即创建一个头节点。

2. 插入节点:在链表的任意位置插入一个节点。

- 头部插入:将新节点作为新的头节点,其指针指向原头节点。

- 中间插入:将新节点插入到指定位置的节点之前,其指针指向指定位置的节点。

- 尾部插入:找到链表尾部节点,将新节点插到尾部节点的后面。

3. 删除节点:在链表中删除指定节点。

- 头部删除:将头节点删除,将头节点的下一个节点作为新的头节点。

- 中间删除:找到指定节点的前驱节点,将前驱节点的指针指向指定节点的后继节点。

- 尾部删除:找到尾部节点的前驱节点,将前驱节点的指针设为NULL。

4. 查找节点:在链表中查找指定数据的节点。

- 遍历链表,逐个比较节点的数据元素,直到找到指定数据或遍历到末尾节点。

5. 修改节点:在链表中修改指定节点的数据。

- 遍历链表,找到指定节点,修改其数据元素。

6. 遍历链表:按顺序遍历链表中的所有节点,进行相应操作。

这些是单链表的基本操作,可以根据需求进行组合和扩展。

单链表解决问题的方法总结

单链表解决问题的方法总结

单链表解决问题的方法总结单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。

单链表可以解决各种问题,以下是一些常见的方法总结。

1. 插入节点:单链表的插入操作可以在任意位置插入节点。

可以在链表的头部或尾部插入节点,也可以在指定位置插入节点。

插入节点的过程包括创建新节点、修改前后节点的引用指针。

通过合适的引用指针操作,可以高效地插入节点。

2. 删除节点:单链表的删除操作可以删除任意位置的节点。

删除节点的过程包括修改前后节点的引用指针,使它们直接指向彼此。

通过合适的引用指针操作,可以高效地删除节点。

需要注意的是,在删除节点前,需要判断节点是否存在,避免出现空指针异常。

3. 查找节点:单链表的查找操作可以查找指定数值或者位置的节点。

从链表的头部开始遍历,依次比较节点的数值或位置,直到找到目标节点。

查找节点的过程需要遍历整个链表,时间复杂度为O(n)。

可以通过合适的算法优化来提高查找效率。

4. 反转链表:单链表的反转操作可以将链表中的节点顺序颠倒。

可以使用三个指针来完成反转,分别指向当前节点、前一个节点和后一个节点。

通过依次修改指针的指向,可以实现链表的反转。

5. 链表合并:单链表的合并操作可以将两个有序链表合并为一个有序链表。

可以比较两个链表的节点数值大小,按照顺序连接节点,直到其中一个链表为空。

最后将剩余的节点连接到新链表的末尾。

6. 环检测:单链表中的环检测是判断链表中是否存在循环的操作。

通过使用两个指针,一个快指针和一个慢指针,从链表的头部开始向前移动。

如果存在循环,则快指针和慢指针会在某个节点相遇。

可以通过这个特性来判断链表中是否存在循环。

这些是单链表解决问题的一些常见方法总结。

根据具体的问题需求,选择合适的方法可以高效地操作单链表,实现所需功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单链表之尾部插入节点
朱有鹏
1、单链表的实现之从尾部插入节点 1.1、从尾部插入节点
先请看上面的图,我们现在已经有了一个只有一个节点的链表,并且用 creat_node 又创建了一个首地址为 new 节点。怎么将这两个节点链接起来?
答案是显而易见的,只需要一步:pHeader->pNext = new; 但是这样的一句代码显然只适用于上图的这一种情况,我们想要的 insert_tail()函数的功能是不管链表后面有几个节点,都可以使用该函数来完 成尾部插入新节点的目的。于是我们就有了下面的思路。 将从尾部插入节点的任务分成两个步骤: (1)找到链表的最后一个节点。 (2)将新的节点和原来的最后一个节点连接起来。
链表有没有头结点是不同的。体现在链表的插入节点,删除节点,遍历节点
解析 链表的各个算法函数都不相同。所以在设计一个链表的时候有头结点后面的
所有算法也 要按照有头结点的情况来处理,如果设计时没有头结点那么后面的 算法也不要考虑头结 点。实际编程中两种链表都有人用,所以在阅读别人的 代码的时候要注意有没有头结点。 我们接下来介绍的算法都是默认有头结点 的。
总之头结点不是必须的,可有可无,但是加上头结点比较好,因为有了头结 点后对所有节点的操作方式就达成了统一不需要每次都对第一个节点特殊对待。
链表还有另外一种用法,就是把头指针指向的第一个节点作为头结点使用。 头结
点有两个特点:它紧跟在头指针后面;头结点的数据部分是空的(或者存链 表的节点数), 指针部分指向第一个有效节点。
这样看来头结点确实和其他节点不同,头节点在创建头指针时一并创建并且 和头指
针关联起来。后面真正存储数据的节点就用节点添加函数来完成,譬如 insert_tail。这 种处理方法的思路就是既然第一个节点注定是要特殊对待 的就干脆让它更特殊一点。
}
1.3、什么是头结点 请思考一下如果像下面的方法来创建第一个节点可不可以? struct node *pHeader = NULL; insert_tail(pHeader, create_node(1)); 答案当然是不可以的。我们在 insert_tail 中直接默认了头指针指向了一个
节 点 , 如 果 我 们 不 给 头 指 针 添 加 一 个 节 点 直 接 insert_tail(pHeader, create_node(1)),函数内部就会试图操作 pHeader->pNext,但是此时 pHeader 的 值是 NULL,因此会导致段错误。我们不得不在定义了头指针后创建一个新节点 给指针初始化,否则不能避免这个错误,但是这样的方法使得我们必须对链表的 第一个节点进行特殊对待。
void insert_tail(struct node *pH, struct node *new) {
struct node *p = pH; while (NULL != p->pNext) // 第一步 {
p = p->pNext; }
p->pNext = new;
// 第二步
}
函数的参数为链表的头指针 pH 和要插入的新节点的首地址 new。第一步的
while 循环用来找到最后一个节点的首地址,第二步的作用就是将新的节点和原
来的最后一个节点连接起来。
1.2、构建第一个简单的链表 好了,现在我们已经实现了 creat_node()和 insert_tail()两个必要的函数,
可以开始构建真正的链表了,先构建一个有 3 个节点; #include <strings.h> #include <stdlib.h> struct node { int data; struct node *pNext; }; struct node * create_node(int data); void insert_tail(struct node *pH, struct node *new); int main(void) { struct node *pHeader = create_node(1); insert_tail(pHeader, create_node(2)); insert_tail(pHeader, create_node(3)); printf("node1 data: %d.\n", pHeader->data); printf("node2 data: %d.\n", pHeader->pNext->data); printf("node3 data: %d.\n", pHeader->pNext->pNext->data); return 0;
相关文档
最新文档