C语言单向链表结构体传址过程的问题?

#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
如果对你有帮助的话希望点个采纳,还有其他疑问的话可以继续为你解答。

img

用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;
}

img