手指舞蹈 2018-10-23 15:41 采纳率: 0%
浏览 1163
已采纳

C语言单链表相关问题求解,具体要求如下

每个学生的信息卡片包括学号、姓名和成绩三项。定义存储学生信息的单向链表的结点类型;编写函 数,由文件依次读入 n(n≥0)个学生的信息,创建一个用于管理学生信息的单向链表;编写函数,对 该链表进行整理,保证该单向链表的结点顺序满足学号从小到大的顺序。

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-10-23 16:47
    关注

    运行程序前,新建一个文本文件1.txt放在C盘下(或者修改下面的Read("c:\\1.txt", head);为你的文件名和路径)
    文件内容:

    1,aaa,82
    2,bbb,99
    3,ccc,75
    4,ddd,63
    5,eee,78
    6,fff,60
    7,test,92.5
    

    以下是程序,用VS2010编译

    // Q703974.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    typedef struct Student
    {
        char no[10];
        char name[10];
        double score;
    };
    
    typedef struct Node
    {
        Node * next;
        Student * s;
    };
    
    void Read(char * filename, Node * head)
    {
        FILE * fp;
        fp = fopen(filename, "r");
        fseek(fp, 0, SEEK_END);
        long filesize = ftell(fp);
        rewind(fp);
        char * pBuff = (char *)malloc(sizeof(char) * filesize + 1);
        memset(pBuff, 0, filesize + 1);
        fread(pBuff, filesize, 1, fp);
        pBuff[filesize] = '\0';
        int offset = 0;
        while (true)
        {
            Student * pstu = (Student *)malloc(sizeof(Student));
            int n = sscanf(pBuff + offset, "%[^,],%[^,],%lf", pstu->no, pstu->name, &pstu->score);
            if (n != 3) break;
    
    
            Node * curr = head;
            while (true)
            {
                if (curr->next == NULL) 
                {
                    head->next = (Node *)malloc(sizeof(Node));
                    head->next->next = NULL;
                    head->next->s = pstu;
                    break;
                }
                else if (curr->next->s->score > pstu->score)
                {
                    Node * t = (Node *)malloc(sizeof(Node));
                    t->next = curr->next;
                    t->s = pstu;
                    curr->next = t;
                    break;
                }
                curr = curr->next;
            }
    
            while (pBuff[offset] != '\n' && pBuff[offset] != '\0') 
                offset++;
            if (pBuff[offset - 1] == '\0') break; else offset++;
        }
        free(pBuff);
        fclose(fp);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Node * head = (Node *)malloc(sizeof(Node));
        head->next = NULL;
        Read("c:\\1.txt", head);
        while (head->next != NULL)
        {
            printf("%s\t%s\t%lf\n", head->next->s->no, head->next->s->name, head->next->s->score);
            head = head->next;
        }
        return 0;
    }
    
    

    图片说明

    如果问题得到解决,麻烦点下采纳,采纳后额外赠送1000个C语言源代码(https://download.csdn.net/download/caozhy/9919273 )

    之前看错了题目,一个小问题,是学号排序,不是成绩,只要改1行:
    else if (curr->next->s->score > pstu->score)
    修改为
    lse if (strcmp(curr->next->s->no, pstu->no) > 0)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!