鱼C论坛

 找回密码
 立即注册
查看: 663|回复: 9

[已解决]链表问题

[复制链接]
发表于 2020-3-19 17:33:40 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求分析一下两个写法的错误,好像发不了图片字,有点乱,见谅。。

typedef struct Student{
        int num;
        string name;
        double score;
        struct Student *next,*front;
}Student,*Head;
Status CreateStudentSystem(Head & head)
{
         int Num;
         string Name;
         double Score;
         head=(Head)malloc(sizeof(Student));
         head->next=NULL;
         Student* first=(Head)malloc(sizeof(Student));
         head->next=first;
                first->next=NULL;
        if(!first)   return ERROR;  
        else
        {
         cout<<"创建成功!"<<endl;
         cout<<"请输入学生个数";
         cin>>len;
         for(int i=1;i<=len;i++)
         {
                Student* Node=(Head)malloc(sizeof(Student));
                Node->next=NULL;
                Node->front=NULL;
                cout<<"请输入名字";
                cin>>Name;
                Node->name=Name;
                cout<<"请输入学号";
                cin>>Num;
                Node->num=Num;
                cout<<"请输入分数";
                cin>>Score;
                Node->score=Score;
                first->next=Node;
                Node->front=first;
                Node->next=NULL;
                first=Node;
         }
   }
        return OK;         
}

typedef struct Student{
        int num;
        string name;
        double score;
        struct Student *next,*front;
}Student,*Head;
Status CreateStudentSystem(Head * head)
{
         int Num;
         string Name;
         double Score;
         (*head)=(Head)malloc(sizeof(Student));
         (*head)->next=NULL;
         Student* first=(Head)malloc(sizeof(Student));
         (*head)->next=first;
                first->next=NULL;
        if(!first)   return ERROR;  
        else
        {
         cout<<"创建成功!"<<endl;
         cout<<"请输入学生个数";
         cin>>len;
         for(int i=1;i<=len;i++)
         {
                Student* Node=(Head)malloc(sizeof(Student));
                Node->next=NULL;
                Node->front=NULL;
                cout<<"请输入名字";
                cin>>Name;
                Node->name=Name;
                cout<<"请输入学号";
                cin>>Num;
                Node->num=Num;
                cout<<"请输入分数";
                cin>>Score;
                Node->score=Score;
                first->next=Node;
                Node->front=first;
                Node->next=NULL;
                first=Node;
         }
   }
        return OK;         
}
第一个是在输入完名字就结束程序,第二个在输入完学号就结束了
最佳答案
2020-3-19 21:58:45
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
struct Student
{
    int id;
    double score;
    string name;
    Student *next;
};
Student *CreatStuList(const int num)
{
    int t = 0;                   //学生个数计数器
    Student *node = new Student; //创建新节点
    Student *head = node;        //保存首节点
    cout << "请输入学生编号/名字/得分" << endl;
    while (num > 0)
    {
        cin >> node->id >> node->name >> node->score; //输入数据
        t++;
        if (t == num) //结束条件
        {
            node->next = nullptr; //尾结点置空
            break;
        }
        node->next = new Student; //创建新节点
        node = node->next;        //移动指针指向新节点
    }
    return head;
}
void printlist(Student *head)
{
    while (head != nullptr)
    {
        cout << "\n编号" << head->id << "\n姓名" << head->name << "\n得分" << head->score << "\n"
             << endl;
        head = head->next;
    }
}
int main(int argc, char const *argv[])
{
    int a = 4;                       //学生个数
    Student *head = CreatStuList(a); //创建链表
    printlist(head);                 //输出链表
    return 0;
}
---------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.592]
(c) 2019 Microsoft Corporation。保留所有权利。

D:\My data\Documents\C++> cmd /C "c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.3\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-afybbiiy.s3m --stdout=Microsoft-MIEngine-Out-lvthf1zh.xnt --stderr=Microsoft-MIEngine-Error-mh3gydww.2kf --pid=Microsoft-MIEngine-Pid-iwn3yrwz.icl --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi "
请输入学生编号/名字/得分
1 a 1
2 d 3
3 d 0
4 f 0

编号1
姓名a
得分1


编号2
姓名d
得分3


编号3
姓名d
得分0


编号4
姓名f
得分0


D:\My data\Documents\C++>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-19 19:39:50 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-19 21:58:45 | 显示全部楼层    本楼为最佳答案   
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
struct Student
{
    int id;
    double score;
    string name;
    Student *next;
};
Student *CreatStuList(const int num)
{
    int t = 0;                   //学生个数计数器
    Student *node = new Student; //创建新节点
    Student *head = node;        //保存首节点
    cout << "请输入学生编号/名字/得分" << endl;
    while (num > 0)
    {
        cin >> node->id >> node->name >> node->score; //输入数据
        t++;
        if (t == num) //结束条件
        {
            node->next = nullptr; //尾结点置空
            break;
        }
        node->next = new Student; //创建新节点
        node = node->next;        //移动指针指向新节点
    }
    return head;
}
void printlist(Student *head)
{
    while (head != nullptr)
    {
        cout << "\n编号" << head->id << "\n姓名" << head->name << "\n得分" << head->score << "\n"
             << endl;
        head = head->next;
    }
}
int main(int argc, char const *argv[])
{
    int a = 4;                       //学生个数
    Student *head = CreatStuList(a); //创建链表
    printlist(head);                 //输出链表
    return 0;
}
---------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.592]
(c) 2019 Microsoft Corporation。保留所有权利。

D:\My data\Documents\C++> cmd /C "c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.3\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-afybbiiy.s3m --stdout=Microsoft-MIEngine-Out-lvthf1zh.xnt --stderr=Microsoft-MIEngine-Error-mh3gydww.2kf --pid=Microsoft-MIEngine-Pid-iwn3yrwz.icl --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi "
请输入学生编号/名字/得分
1 a 1
2 d 3
3 d 0
4 f 0

编号1
姓名a
得分1


编号2
姓名d
得分3


编号3
姓名d
得分0


编号4
姓名f
得分0


D:\My data\Documents\C++>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 22:03:26 | 显示全部楼层
本帖最后由 bin554385863 于 2020-3-19 22:13 编辑

typedef struct Student{
        int num;
        string name;
        double score;
        struct Student *next,*front;
}Student,*Head;
Status CreateStudentSystem(Head & head)

Head本身就能定义指针,你还加& 干嘛

第二段Head *head也是同样的问题

而且status是什么鬼

至于创建链表的代码看的我头大,你可比较一下我写的单项链表代码,有注释,如果没学new,嗯,你认为可以认为它是C++版的malloc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 22:12:03 From FishC Mobile | 显示全部楼层
bin554385863 发表于 2020-3-19 21:58
-------------------------------------------------------------------------------------------------- ...

我感觉就是用了malloc的问题。。感觉用new简洁又简单。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 22:14:17 | 显示全部楼层
尊贵vip用户 发表于 2020-3-19 22:12
我感觉就是用了malloc的问题。。感觉用new简洁又简单。。

是的,malloc很容易出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 22:17:29 From FishC Mobile | 显示全部楼层
bin554385863 发表于 2020-3-19 22:03
typedef struct Student{
        int num;
        string name;

这不算是二级指针吗。。。我看小甲鱼的视频用的二级指针还有网上一些说是要二级指针的,&是共用体,修改时用的,至于status是宏定义。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 22:30:00 | 显示全部楼层
尊贵vip用户 发表于 2020-3-19 22:17
这不算是二级指针吗。。。我看小甲鱼的视频用的二级指针还有网上一些说是要二级指针的,&是共用体,修改 ...

除非必要最好不要用多级指针,能用一级指针搞定最好不要用多级指针,说白了多级指针都是用来装B的,甚至随着学习c++的深入指针也是除非必要能不用就不用,而选择用更加安全的引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 22:38:00 From FishC Mobile | 显示全部楼层
bin554385863 发表于 2020-3-19 22:30
除非必要最好不要用多级指针,能用一级指针搞定最好不要用多级指针,说白了多级指针都是用来装B的,甚至 ...

知道c语言的指针非常重要,原本想看看自己的水平磨炼一下自己的,但是今天被这短短的代码折磨一天后我还是老老实实的能简单简单吧。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 22:40:10 | 显示全部楼层
尊贵vip用户 发表于 2020-3-19 22:38
知道c语言的指针非常重要,原本想看看自己的水平磨炼一下自己的,但是今天被这短短的代码折磨一天后我还 ...

慢慢来,谁也不是一下学会的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表