「已注销」 2022-12-06 09:24 采纳率: 90.2%
浏览 34
已结题

C语言关于构造链表的问题

问题遇到的现象和发生背景 C语言链表

已知链表的结点如下:
struct Student
{ long num;
float score;
struct Student*next;
};
(1) 链表生成
要求设计函数
struct Student * creatStuLink(long int *, float *,int n)
{//提示要动态的创建链表。
}
功能是给定学号和分数两个数组,根据数组创建链表,并返回头结点。
例如 主函数中有学生学号和对应成绩如下:
long int nu[5]={9220101, 9220102, 9220108, 9220111, 9220115};
float sc[5]={98, 77, 67.5, 88.5, 89};
struct Student * Head;
当在调用 creatStuLink 后
Head= creatStuLink(nu, sc,5);
Head 为含五个学生信息的链表的头结点,最后一个结点的 next 要为 NULL。
C 语言实验上机指导 实验 7 结构体
(2) 链表结点内存释放
知某链表的头结点为 Head
类型为:struct Student *
请设计函数
struct Student *releaseStuLink(struct Student *pHead)
功能是将动态创建的链表 pHead,所有结点依次释放(用 free),成功释放后 要打印输出该结
点的学号和成绩。

用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>
#include<stdlib.h>
typedef struct Student{
    long num;
    float score;
    struct Student *next;
}Stu;

typedef struct _list{
    Stu *head;
    Stu *tail;
}List;

Stu *creatStuLink(long int*,float*,int n);
Stu *releaseStuLink(Stu *pHead);

int main()
{
    int n=5;
    long int nu[5]={9220101,92201002,9220108,9220111,9220115};
    float sc[5]={98,77,67.5,88.5,89};
    Stu *Head;
    Head=creatStuLink(nu,sc,n);
    Head=releaseStuLink(Head);
    return 0;
}

//当在调用 creatStuLink 后
//Head= creatStuLink(nu, sc,5);
//Head 为含五个学生信息的链表的头结点,最后一个结点的 next 要为 NULL。
Stu *creatStuLink(long int* nu,float* sc,int n)
{
    List list;
    list.head=NULL;//先定义头结点 
    while(n--)
    {
    Stu*p=(Stu*)malloc(sizeof(Stu));
    p->num=nu[5-n];
    p->score=sc[5-n];
    p->next=NULL;//最后一个结点的next要为NULL 
    if(n=5)list.head=p;
    Stu *last=list.head;
    if(last){
        while(last->next){
            last=last->next;
        }
        last->next=p;
    }
    }
    return list.head;//返回头结点 
}

//功能是将动态创建的链表 pHead,所有结点依次释放(用 free),成功释放后 要打印输出该结
//点的学号和成绩
Stu *releaseStuLink(Stu *pHead)
{
    Stu *p,*q;
    q=pHead->next;
    p=q;
    printf("%d %f\n",pHead->num,pHead->score);
    free(pHead);
    for(;p;p=q)
    {
        q=p->next;
        printf("%d %f\n",p->num,p->score);
        free(p);
    }
    return NULL;
}

运行结果及报错内容 过了编译但是没有输出
我的解答思路和尝试过的方法 找不到哪里有问题,以及在输入数据的时候有无更好的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-12-06 10:36
    关注

    修改如下,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct Student {
        long   num;
        float  score;
        struct Student* next;
    }Stu;
    typedef struct _list {
        Stu* head;
        Stu* tail;
    }List;
    Stu* creatStuLink(long int*, float*, int n);
    Stu* releaseStuLink(Stu* pHead);
    int main()
    {
        int n = 5;
        long int nu[5] = { 9220101,92201002,9220108,9220111,9220115 };
        float sc[5] = { 98,77,67.5,88.5,89 };
        Stu* Head;
        Head = creatStuLink(nu, sc, n);
        Head = releaseStuLink(Head);
        return 0;
    }
    //当在调用 creatStuLink 后
    //Head= creatStuLink(nu, sc,5);
    //Head 为含五个学生信息的链表的头结点,最后一个结点的 next 要为 NULL。
    Stu* creatStuLink(long int* nu, float* sc, int n)
    {
        List list;
        list.head = NULL;//先定义头结点 
        while (n) //(n--)  修改
        {
            Stu* p = (Stu*)malloc(sizeof(Stu));
            p->num = nu[5 - n];
            p->score = sc[5 - n];
            p->next = NULL;//最后一个结点的next要为NULL 
            if (n == 5)            //if (n = 5)  修改
                list.head = p;    
            else                     //修改
                list.tail->next = p; //修改
            list.tail = p;           //修改
    
            //Stu* last = list.head; 修改
            //if (last) {
            //    while (last->next) {
            //        last = last->next;
            //    }
            //    last->next = p;
            //}
            n--;    //修改
        }
        return list.head;//返回头结点 
    }
    //功能是将动态创建的链表 pHead,所有结点依次释放(用 free),成功释放后 要打印输出该结
    //点的学号和成绩
    Stu* releaseStuLink(Stu* pHead)
    {
        Stu* p, * q;
        q = pHead;   //q = pHead->next;修改
                     //p = q;
                     //printf("%d %f\n", pHead->num, pHead->score);
                    //free(pHead);
        while (q)    //for (; q; p = q) 修改
        {
            p = q;      //修改
            q = q->next;//修改
            printf("%d %f\n", p->num, p->score);
            free(p);
        }
        return NULL;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 已采纳回答 12月6日
  • 创建了问题 12月6日

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题