马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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。
通过对这些示例进行演算,您将更深入地了解头插入和尾插入的概念和实现。如果您在演算过程中遇到任何困惑或问题,请随时向我求助。
|