#include
#pragma warning (disable:4996)
struct Node* head = NULL; //头节点全局变量
struct Node* inser_node = NULL;
struct Node
{
int data; //单向链表的数据
struct Node* next;
};
void insertlist_random(int data_in_tem);//声明函数
void create_list(int data_item); //声明函数
void create_list(int data_item)
{
struct Node* inser_node = (struct Node*)malloc(sizeof(struct Node*));
if (inser_node == NULL)
{
printf("内存分配失败");
exit(0);
}
else
{
inser_node->data = data_item;
inser_node->next = head;
head = inser_node; //头结点head
printf("节点已经插入了。\n");
}
return;
}
void insertlist_random(int data_in_tem)
{
struct Node* insert_Node = (struct Node*)malloc(sizeof(struct Node*));
int insertpos;//局部变量
struct Node* temp_node; //临时的节点指向头节点head
if (insert_Node == NULL)
{
printf("分配内存失败!");
exit(0);//正常退出程序
}
else
{
printf("请输入插入的位置:\n");//节点从0(零)开始插入的
scanf("%d", &insertpos);
insert_Node->data = data_in_tem;
temp_node = head; // 这里是 第50行
//这里是temp_node结构体指针指向head全局变量结构体指针,但是temp_node是取head的值的,怎么下断点后
//观察到67步后的temp_node->next = insert_Node;中的temp_node->next的数据和指针内存地址 怎么赋值到head结构体这里了?
//这是怎么回事?
for (int i = 0; i < insertpos; i++)
{
temp_node = temp_node->next; //第57行
//这里for循环一次temp_node->next内容指针就少一个是怎么做到的?
if (temp_node == NULL)
{
printf("前面没有节点,无法插入新的节点:\n");
exit(0);
}
}
insert_Node->next = temp_node->next;
temp_node->next = insert_Node; //这里是第67行
//下断点后第2次以后循环观察走过这里后第50行的 temp_node = head;也就是头节点怎
//么将temp_node->next的值传递给head头节点了?传递过程是什么呢?我想知道是怎么传递到head头节点的?
//通过temp_node->next指针内存地址传递的?怎么传递的?实在不明白原理了
printf("新节点已经插入成功");
}
return;
}
int main()
{
int choice;
int inputdata;
do
{
printf("请输入插入节点的数据:\n");
scanf("%d", &inputdata); //节点从零0开始
if (head == NULL)
{
create_list(inputdata);//插入到表头让表头head指针有值并指向第一节点
}
else
{
insertlist_random(inputdata);//头节点不为空走这里
}
printf("如果想退出就输入一个非0后回车:\n");
scanf("%d", &choice);
} while (choice == 0);
return 0;
}
我想要知道第50行,第57行,第67行的问题麻烦了。下边是我在控制台填写的内容:
请输入插入节点的数据:
10
节点已经插入了。
如果想退出就输入一个非0后回车:
0
请输入插入节点的数据:
11
请输入插入的位置:
0
新节点已经插入成功如果想退出就输入一个非0后回车:
0
请输入插入节点的数据:
12
请输入插入的位置:
1
新节点已经插入成功如果想退出就输入一个非0后回车:
0
请输入插入节点的数据:
13
请输入插入的位置:
2
新节点已经插入成功如果想退出就输入一个非0后回车:
0
请输入插入节点的数据:
14
请输入插入的位置:
3
新节点已经插入成功如果想退出就输入一个非0后回车:
0
题主,你好,我仔细看过了你的代码和疑问,晚上特意写了一篇非常详细的关于单链表的文章。
https://blog.csdn.net/qq_41796226/article/details/125980808?spm=1001.2014.3001.5502
如果对你有帮助的话希望点个采纳,还有其他疑问的话可以继续为你解答。
用C/C++代码块格式化一下吧。另外代码需要调试一下
struct Node* insert_Node = (struct Node*)malloc(sizeof(struct Node*));
这里有问题啊,malloc中应该是sizeof(struct Node),不能加*号的,否则只申请了一个指针地址的空间,也就是一个整型的空间,实际你要申请的是一个数据结构的空间
要学会画图,画个图方便看的更明白些,更方便理解。
生成新结点的两个语句:struct Node* inser_node = (struct Node*)malloc(sizeof(struct Node*)); 最后的*多余了,
修改为:struct Node* inser_node = (struct Node*)malloc(sizeof(struct Node));
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
struct Node* head = NULL; //头节点全局变量
struct Node* inser_node = NULL;
struct Node
{
int data; //单向链表的数据
struct Node* next;
};
void insertlist_random(int data_in_tem);//声明函数
void create_list(int data_item); //声明函数
void create_list(int data_item)
{
struct Node* inser_node = (struct Node*)malloc(sizeof(struct Node)); //修改
if (inser_node == NULL)
{
printf("内存分配失败");
exit(0);
}
else
{
inser_node->data = data_item;
inser_node->next = head;
head = inser_node; //头结点head
printf("节点已经插入了。\n");
}
return;
}
void insertlist_random(int data_in_tem)
{
struct Node* insert_Node = (struct Node*)malloc(sizeof(struct Node)); //修改
int insertpos;//局部变量
struct Node* temp_node; //临时的节点指向头节点head
if (insert_Node == NULL)
{
printf("分配内存失败!");
exit(0);//正常退出程序
}
else
{
printf("请输入插入的位置:\n");//节点从0(零)开始插入的
scanf("%d", &insertpos);
insert_Node->data = data_in_tem;
temp_node = head; // 这里是 第50行
//这里是temp_node结构体指针指向head全局变量结构体指针,但是temp_node是取head的值的,怎么下断点后
//观察到67步后的temp_node->next = insert_Node;中的temp_node->next的数据和指针内存地址 怎么赋值到head结构体这里了?
//这是怎么回事?
for (int i = 0; i < insertpos - 1; i++) //for (int i = 0; i < insertpos; i++) 修改
{
temp_node = temp_node->next; //第57行
//这里for循环一次temp_node->next内容指针就少一个是怎么做到的?
if (temp_node == NULL)
{
printf("前面没有节点,无法插入新的节点:\n");
return; //exit(0); // 修改
}
}
insert_Node->next = temp_node->next;
temp_node->next = insert_Node; //这里是第67行
//下断点后第2次以后循环观察走过这里后第50行的 temp_node = head;也就是头节点怎
//么将temp_node->next的值传递给head头节点了?传递过程是什么呢?我想知道是怎么传递到head头节点的?
//通过temp_node->next指针内存地址传递的?怎么传递的?实在不明白原理了
printf("新节点已经插入成功\n");
}
return;
}
int main()
{
int choice;
int inputdata;
do
{
printf("请输入插入节点的数据:\n");
scanf("%d", &inputdata); //节点从零0开始
if (head == NULL)
{
create_list(inputdata);//插入到表头让表头head指针有值并指向第一节点
}
else
{
insertlist_random(inputdata);//头节点不为空走这里
}
printf("如果想退出就输入一个非0后回车:\n");
scanf("%d", &choice);
} while (choice == 0);
struct Node* p = head; //以下输出已建立的链表
while (p) {
printf("%d ", p->data);
p = p->next;
}
return 0;
}