尊贵vip用户 发表于 2020-3-19 17:33:40

链表问题

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

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;         
}
第一个是在输入完名字就结束程序,第二个在输入完学号就结束了

尊贵vip用户 发表于 2020-3-19 19:39:50

bin554385863 发表于 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++>

bin554385863 发表于 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

尊贵vip用户 发表于 2020-3-19 22:12:03

bin554385863 发表于 2020-3-19 21:58
-------------------------------------------------------------------------------------------------- ...

我感觉就是用了malloc的问题。。感觉用new简洁又简单。。

bin554385863 发表于 2020-3-19 22:14:17

尊贵vip用户 发表于 2020-3-19 22:12
我感觉就是用了malloc的问题。。感觉用new简洁又简单。。

是的,malloc很容易出错{:10_284:}

尊贵vip用户 发表于 2020-3-19 22:17:29

bin554385863 发表于 2020-3-19 22:03
typedef struct Student{
      int num;
      string name;


这不算是二级指针吗。。。我看小甲鱼的视频用的二级指针还有网上一些说是要二级指针的,&是共用体,修改时用的,至于status是宏定义。。

bin554385863 发表于 2020-3-19 22:30:00

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

除非必要最好不要用多级指针,能用一级指针搞定最好不要用多级指针,说白了多级指针都是用来装B的,甚至随着学习c++的深入指针也是除非必要能不用就不用,而选择用更加安全的引用

尊贵vip用户 发表于 2020-3-19 22:38:00

bin554385863 发表于 2020-3-19 22:30
除非必要最好不要用多级指针,能用一级指针搞定最好不要用多级指针,说白了多级指针都是用来装B的,甚至 ...

知道c语言的指针非常重要,原本想看看自己的水平磨炼一下自己的,但是今天被这短短的代码折磨一天后我还是老老实实的能简单简单吧。。。{:10_266:}

bin554385863 发表于 2020-3-19 22:40:10

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

慢慢来,谁也不是一下学会的
页: [1]
查看完整版本: 链表问题