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

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

#include<stdio.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; 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

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-07-25 15:55
    关注
    struct Node* insert_Node = (struct Node*)malloc(sizeof(struct Node*));
    这里有问题啊,malloc中应该是sizeof(struct Node),不能加*号的,否则只申请了一个指针地址的空间,也就是一个整型的空间,实际你要申请的是一个数据结构的空间
     
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月19日
  • 已采纳回答 9月11日
  • 创建了问题 7月25日

悬赏问题

  • ¥15 在codeblocks里主函数运行到打印生成的链表就结束了 没有再往下是为什么呢
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合