昏昏暗暗 2022-07-25 15:46 采纳率: 81%
浏览 110
已结题

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

  • 写回答

3条回答 默认 最新

  • 摁回车的大雷 2022-07-25 21:25
    关注

    题主,你好,我仔细看过了你的代码和疑问,晚上特意写了一篇非常详细的关于单链表的文章。
    https://blog.csdn.net/qq_41796226/article/details/125980808?spm=1001.2014.3001.5502
    如果对你有帮助的话希望点个采纳,还有其他疑问的话可以继续为你解答。

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月25日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料