m0_65699050 2022-10-31 11:17 采纳率: 80%
浏览 36
已结题

链表初始化的形参为什么要是指针变量+引用类型。

问题遇到的现象和发生背景

数据结构链表的初始化写入值

用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>

#include<iostream>
using std::cin;
using std::cout;
using std::endl;
#include <stdlib.h>
#include<malloc.h>
#define OK 1
#define FALSE 0
typedef int status;
typedef int elemtype;
typedef struct LNode {
    elemtype data;
    struct LNode* next;
}LNode, * LinkList;
status init_LinkList1();
status output_LinkList(LinkList L);



status init_LinkList1(LinkList L)
{
    int n;
    printf("请输入将要建立的链表的长度:");
    cin >> n;
    cout << endl;
    printf("请输入值:");
    LNode* newbase = (LNode*)malloc(sizeof(LNode));
    if (newbase) {
        L = newbase;
        L->next = 0;
        //    printf("建立头节点成功\n");
    }
    else return 0;//建立头节点 
    LNode* r = L; //尾指针 
    LNode* p;
    for (int i = 1; i <= n; ++i)
    {
        LinkList newbase = new LNode;
        if (newbase)
        {
            p = newbase;
            cin >> p->data;
            p->next = NULL;
            r->next = p;
            r = p;
            //    printf("赋值成功\n");
        }
    }
    printf("赋值成功\n");
    return OK;
}
status output_LinkList(LinkList L) {
    LNode* p = L->next;
    printf("\n链表中的数据为:");
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }

    //    p=p->next;
    return OK;
}

int main()
{
    LinkList L=0;
    init_LinkList1(L);
    output_LinkList(L);
}

运行结果及报错内容

不能执行输出函,并且非正常退出

我的解答思路和尝试过的方法

用C++的语法,在初始化函数的形参列表里加上引用。

我想要达到的结果

解释一下为什么要加上引用才行。我的想法是:不加引用,函数是地址传递,同样可以做到改变L,但实际上会非正常退出。

  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2022-10-31 11:39
    关注

    因为main函数中,只是定义了一个L,是个空指针,函数内要实现外部指针地址的修改,就必须用指针的指针类型,或者指针的引用类型。因为指针的引用类型写法比较简单,所以能用引用的情况下,用指针的引用更加常用。如果不支持引用类型,就需要用指针的指针类型。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • qzjhjxj 2022-10-31 11:53
    关注

    改动处见注释,供参考:

    #include<iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    #include <cstdlib>   //修改
    //#include <malloc.h>//修改 
    #define OK 1
    #define FALSE 0
    typedef int status;
    typedef int elemtype;
    typedef struct LNode {
        elemtype data;
        struct LNode* next;
    }LNode, * LinkList;
    status init_LinkList1(LinkList* L);  //修改
    status output_LinkList(LinkList L);
    
    status init_LinkList1(LinkList* L)  //修改
    {
        int n;
        printf("请输入将要建立的链表的长度:");
        cin >> n;
        cout << endl;
        printf("请输入值:");
        LNode* newbase = new LNode;
        //LNode* newbase = (LNode*)malloc(sizeof(LNode));  //修改
        if (newbase) {
            (*L) = newbase;          //修改
            (*L)->next = 0;          //修改
            //    printf("建立头节点成功\n");
        }
        else return 0;//建立头节点 
        LNode* r = (*L); //尾指针   //修改  
        LNode* p;
        for (int i = 1; i <= n; ++i)
        {
            LinkList newbase = new LNode;
            if (newbase)
            {
                p = newbase;
                cin >> p->data;
                p->next = NULL;
                r->next = p;
                r = p;
                //printf("赋值成功\n");
            }
        }
        printf("赋值成功\n");
        return OK;
    }
    status output_LinkList(LinkList L) {
        LNode* p = L->next;
        printf("\n链表中的数据为:");
        while (p) {
            printf("%d ", p->data);
            p = p->next;
        }
        //    p=p->next;
        return OK;
    }
    
    int main()
    {
        LinkList L = 0;
        init_LinkList1(&L);   //修改
        output_LinkList(L);
        return 0;
    }
    
    
    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-31 14:03
    关注
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月10日
  • 已采纳回答 11月2日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 要求编写稀疏矩阵A的转置矩阵的算法
  • ¥15 编写满足以下要求的停车场管理程序,设停车场只有一个可停放n辆车的狭窄通道且只有一个大门可供车辆进出。
  • ¥20 powerbulider 导入excel文件,显示不完整
  • ¥15 用keil调试程序保证结果进行led相关闪烁
  • ¥15 paddle训练自己的数据loss降不下去
  • ¥20 用matlab的pdetool解决以下三个问题
  • ¥15 单个福来轮的平衡与侧向滑动是如何做到的?
  • ¥15 嵌入式Linux固件,能直接告诉我crc32校验的区域在哪不,内核的校验我已经找到了,uboot没有
  • ¥20 h3c静态路要求有详细过程
  • ¥15 调制识别中输入为时频图,星座图,眼图等