单链表之尾部插入节点
- 格式:pdf
- 大小:703.27 KB
- 文档页数:3
单链表-尾插法
尾插法:元素插⼊在链表尾部,也叫尾插法。
①从⼀个空表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语⾔实现*/#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语言单链表尾插法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 单链表基本操作
单链表是一种常见的数据结构,由一个个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
基本操作包括以下几种:
1. 创建链表:创建一个空链表,即创建一个头节点。
2. 插入节点:在链表的任意位置插入一个节点。
- 头部插入:将新节点作为新的头节点,其指针指向原头节点。
- 中间插入:将新节点插入到指定位置的节点之前,其指针指向指定位置的节点。
- 尾部插入:找到链表尾部节点,将新节点插到尾部节点的后面。
3. 删除节点:在链表中删除指定节点。
- 头部删除:将头节点删除,将头节点的下一个节点作为新的头节点。
- 中间删除:找到指定节点的前驱节点,将前驱节点的指针指向指定节点的后继节点。
- 尾部删除:找到尾部节点的前驱节点,将前驱节点的指针设为NULL。
4. 查找节点:在链表中查找指定数据的节点。
- 遍历链表,逐个比较节点的数据元素,直到找到指定数据或遍历到末尾节点。
5. 修改节点:在链表中修改指定节点的数据。
- 遍历链表,找到指定节点,修改其数据元素。
6. 遍历链表:按顺序遍历链表中的所有节点,进行相应操作。
这些是单链表的基本操作,可以根据需求进行组合和扩展。
单链表解决问题的方法总结单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。
单链表可以解决各种问题,以下是一些常见的方法总结。
1. 插入节点:单链表的插入操作可以在任意位置插入节点。
可以在链表的头部或尾部插入节点,也可以在指定位置插入节点。
插入节点的过程包括创建新节点、修改前后节点的引用指针。
通过合适的引用指针操作,可以高效地插入节点。
2. 删除节点:单链表的删除操作可以删除任意位置的节点。
删除节点的过程包括修改前后节点的引用指针,使它们直接指向彼此。
通过合适的引用指针操作,可以高效地删除节点。
需要注意的是,在删除节点前,需要判断节点是否存在,避免出现空指针异常。
3. 查找节点:单链表的查找操作可以查找指定数值或者位置的节点。
从链表的头部开始遍历,依次比较节点的数值或位置,直到找到目标节点。
查找节点的过程需要遍历整个链表,时间复杂度为O(n)。
可以通过合适的算法优化来提高查找效率。
4. 反转链表:单链表的反转操作可以将链表中的节点顺序颠倒。
可以使用三个指针来完成反转,分别指向当前节点、前一个节点和后一个节点。
通过依次修改指针的指向,可以实现链表的反转。
5. 链表合并:单链表的合并操作可以将两个有序链表合并为一个有序链表。
可以比较两个链表的节点数值大小,按照顺序连接节点,直到其中一个链表为空。
最后将剩余的节点连接到新链表的末尾。
6. 环检测:单链表中的环检测是判断链表中是否存在循环的操作。
通过使用两个指针,一个快指针和一个慢指针,从链表的头部开始向前移动。
如果存在循环,则快指针和慢指针会在某个节点相遇。
可以通过这个特性来判断链表中是否存在循环。
这些是单链表解决问题的一些常见方法总结。
根据具体的问题需求,选择合适的方法可以高效地操作单链表,实现所需功能。
c语言单链表尾插法在C语言中,使用单链表数据结构时,可以使用尾插法来插入新的节点。
尾插法是指在链表的末尾插入新的节点。
下面是一个使用尾插法实现单链表插入节点的示例代码:c#include<stdio.h>#include<stdlib.h>struct node {int data;struct node* next;};void insert_at_end(struct node** head, int data) {// 分配新节点的内存空间struct node* new_node = (struct node*)malloc(sizeof(struct node));new_node->data = data;new_node->next = NULL;// 如果链表为空,将新节点设置为头节点if (*head == NULL) {*head = new_node;return;}// 找到链表的末尾节点struct node* last_node = *head;while (last_node->next != NULL) {last_node = last_node->next;}// 将新节点插入到链表的末尾last_node->next = new_node;}int main() {// 创建一个包含3个节点的单链表:1 -> 2 -> 3struct node* head = NULL;insert_at_end(&head, 1);insert_at_end(&head, 2);insert_at_end(&head, 3);// 输出链表中的所有节点数据struct node* current_node = head;while (current_node != NULL) {printf("%d ", current_node->data);current_node = current_node->next;}printf("\n");// 释放链表中每个节点的内存空间current_node = head;while (current_node != NULL) {struct node* next_node = current_node->next;free(current_node);current_node = next_node;}return0;}在这个示例代码中,我们定义了一个结构体node来表示单链表中的每个节点。
c语言单链表尾插法摘要:一、单链表的概念1.单链表的定义2.单链表的特点二、尾插法的原理1.尾插法的定义2.尾插法的基本思想三、C 语言实现尾插法1.创建链表节点结构体2.定义尾插法函数3.插入节点操作四、尾插法的优缺点1.优点2.缺点五、总结正文:一、单链表的概念单链表是一种线性数据结构,它由若干个节点组成,每个节点只包含一个指向下一个节点的指针。
单链表的特点是插入和删除操作方便,但查找操作较慢。
二、尾插法的原理尾插法是一种在单链表尾部插入节点的算法。
它的基本思想是:当需要插入一个新节点时,遍历链表,找到尾节点,然后将新节点的指针指向尾节点的下一个节点,最后将尾节点的指针指向新节点。
三、C 语言实现尾插法1.创建链表节点结构体```ctypedef struct Node {int data;struct Node* next;} Node;```2.定义尾插法函数```cvoid append(Node** head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if (*head == NULL) {*head = newNode;} else {Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;}}```3.插入节点操作```cint main() {Node* head = NULL;append(&head, 1);append(&head, 2);append(&head, 3);Node* temp = head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL");return 0;}```四、尾插法的优缺点1.优点:尾插法在插入节点时,只需操作尾节点,无需遍历整个链表,因此时间复杂度较低,适合频繁插入的场景。