|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
单链表尾插入和头插入函数代码实现是怎样的呢?
虽然有注释 但是还是看不太明白逻辑 能以生动形象的方式解答以下吗?
或者图片的方式给我以下分析思路!万分感谢!
- #include<stdio.h>
- #include<stdlib.h>
- struct Node
- {
- int value; // 节点存储的值
- struct Node *next; // 指向下一个节点的指针
- };
- // 判断单链表是否为回文链表
- int recurCheck(struct Node *head, struct Node *tail);
- // 遍历并打印单链表
- void printNode(struct Node *head);
- // 在链表头部插入节点
- void insertNode_one(struct Node **head, int value);
- // 在链表尾部插入节点
- void insertNode_two(struct Node **head, int value);
- void insertNode_one(struct Node **head, int value)
- {
- struct Node *node; // 定义节点指针
- struct Node *temp; // 临时变量指针,用于保存当前头结点的下一个节点
-
- node = (struct Node *)malloc(sizeof(struct Node)); // 为节点分配内存空间
- if(node == NULL) // 判断内存分配是否成功
- {
- printf("内存分配失败了!\n");
- exit(1);
- }
-
- node->value = value; // 将输入的值存入新节点value成员变量中
-
- if(*head != NULL) // 单链表不为空
- {
- temp = *head; // 将临时指针变量保存为当前头结点的下一个节点
- *head = node; // 将node指针变量的值更新为头结点指针变量的值
- node->next = temp; // 将node指针变量的下一个节点为当前头结点的下一个节点
- }
- else // 单链表为空
- {
- *head = node; // 直接将node指针变量赋值给头结点指针变量
- node->next = NULL; // 将node指针变量的下一个节点赋值为NULL
- }
- }
- void insertNode_two(struct Node **head, int value)
- {
- struct Node *node; // 定义节点指针
- struct Node *temp; // 临时变量指针,用于保存当前头结点的下一个节点
-
- node = (struct Node *)malloc(sizeof(struct Node)); // 为节点分配内存空间
- if(node == NULL) // 判断内存分配是否成功
- {
- printf("内存分配失败了!\n");
- exit(1);
- }
-
- node->value = value; // 将输入的值存入新节点value成员变量中
-
- if(*head != NULL) // 单链表不为空
- {
- temp = *head;
-
- while(temp->next != NULL) // 寻找最后一个节点
- {
- temp = temp->next;
- }
-
- temp->next = node; // 最后一个节点的下一个节点为新插入的节点
- node->next = NULL; // 新插入的节点的下一个节点为NULL
- }
- else // 单链表为空
- {
- *head = node;
- node->next = NULL;
- }
- }
- void printNode(struct Node *head)
- {
- struct Node *current; // 当前节点指针变量
-
- current = head; // 将head指针变量赋值给current指针变量
- printf("录入的单链表是:");
- while(current != NULL) // 循环打印链表中的所有节点
- {
- printf("%d ",current->value);
- current = current->next;
- }
- putchar('\n');
- }
- int recurCheck(struct Node *head_one, struct Node *head_two)
- {
- // 循环遍历两个链表中的每个节点,并比较节点值是否相等
- while(head_one)
- {
- if(head_one->value != head_two->value)
- {
- return 0;
- }
- head_one = head_one->next;
- head_two = head_two->next;
- }
-
- return 1;
- }
- int main(void)
- {
- struct Node *head_one = NULL; // 链表1的头结点指针变量
- struct Node *head_two = NULL; // 链表2的头结点指针变量
-
- int input; // 用于存储用户输入的数字
-
- while(1)
- {
- printf("请输入一个整数(输入-1表示结束):");
- scanf("%d",&input);
-
- if(input == -1)
- {
- break;
- }
-
- insertNode_one(&head_one, input); // 头插入链表1
- insertNode_two(&head_two, input); // 尾插入链表2
- }
-
- printNode(head_two); // 打印链表2,确认尾插入是否成功
- printNode(head_one); // 打印链表1,确认头插入是否成功
-
- if (recurCheck(head_one, head_two)) // 判断链表是否为回文链表
- {
- printf("录入的单链表是回文链表!\n");
- }
- else
- {
- printf("录入的单链表不是回文链表!\n");
- }
-
- return 0;
- }
复制代码
当然可以。让我们用一个详细的示例,分步骤解释头插入和尾插入的过程。
首先,我们将使用头插入法。我们将使用相同的整数序列:1、2 和 3。
1、插入 1:
- 创建新节点 node,将值 1 赋给 node->value
- 检查链表是否为空(*head == NULL),链表为空
- 设置 node 为头节点:*head = node
- 设置 node->next = NULL
结果:链表:1
2、插入 2:
- 创建新节点 node,将值 2 赋给 node->value
- 检查链表是否为空(*head != NULL),链表不为空
- 将临时指针 temp 指向头节点:temp = *head
- 设置新节点为头节点:*head = node
- 设置新头节点的下一个节点为原头节点:node->next = temp
结果:链表:2->1
3、插入 3:
- 创建新节点 node,将值 3 赋给 node->value
- 检查链表是否为空(*head != NULL),链表不为空
- 将临时指针 temp 指向头节点:temp = *head
- 设置新节点为头节点:*head = node
- 设置新头节点的下一个节点为原头节点:node->next = temp
结果:链表:3->2->1
现在,我们使用尾插入法。我们将使用相同的整数序列:1、2 和 3。
1、插入 1:
- 创建新节点 node,将值 1 赋给 node->value
- 检查链表是否为空(*head == NULL),链表为空
- 设置 node 为头节点:*head = node
- 设置 node->next = NULL
结果:链表:1
2、插入 2:
- 创建新节点 node,将值 2 赋给 node->value
- 检查链表是否为空(*head != NULL),链表不为空
- 将临时指针 temp 指向头节点:temp = *head
- 遍历链表,直到找到最后一个节点(temp->next == NULL)
- 将新节点连接到最后一个节点:temp->next = node
- 设置 node->next = NULL
结果:链表:1->2
3、插入 3:
- 创建新节点 node,将值 3 赋给 node->value
- 检查链表是否为空(*head != NULL),链表不为空
- 将临时指针 temp 指向头节点:temp = *head
- 遍历链表,直到找到最后一个节点(temp->next == NULL)
- 将新节点连接到最后一个节点:temp->next = node
- 设置 node->next = NULL
结果:链表:1->2->3
现在您可以用这个详细的示例在草稿纸上代入演算。这将帮助您更好地理解头插入和尾插入的过程。
在演算时,请注意以下关键点:
- 对于头插入法,新节点总是插入到链表的开头。因此,当我们插入一个新节点时,原来的头节点需要变成新节点的下一个节点。这就是为什么我们需要将原头节点的指针赋给新节点的 next 指针,并将新节点设置为头节点。
- 对于尾插入法,新节点总是插入到链表的末尾。因此,我们需要遍历链表,找到最后一个节点,然后将新节点连接到最后一个节点。最后一个节点的 next 指针需要指向新节点,新节点的 next 指针设置为 NULL。
通过对这些示例进行演算,您将更深入地了解头插入和尾插入的概念和实现。如果您在演算过程中遇到任何困惑或问题,请随时向我求助。
|
|