lhh1xx 2023-10-08 19:33 采纳率: 0%
浏览 2

数据结构存盘怎么办哦(⊙o⊙)?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef  struct student
{
    int xuehao;
    char name[20];
    int chinese;
    int math;
    int english;
    float cj;
}student;

typedef  struct Node
{
    student stu;
    struct Node* next;
}Node;

Node* initList();
void addStudent(Node* list);
void showStudent(Node* list);
void addCount(Node* list);
void sortBycj(Node* list);
void searchStudent(Node* list);
void deleteStudent(Node* list);
void modifyStudent(Node* list);
void save(Node* list); 
void read(Node* list);

void menu()
{
    printf("**********************************\n");
    printf(" * 学生成绩管理系统——帮助菜单 * \n");
    printf("**********************************\n");
    printf(" *       1. 添加学生信息        * \n");
    printf(" *       2. 查看学生信息        * \n");
    printf(" *       3. 计算总成绩          * \n");
    printf(" *       4. 依总成绩排序        * \n");
    printf(" *       5. 查找学生信息        * \n");
    printf(" *       6. 删除学生信息        * \n");
    printf(" *       7. 修改学生信息        * \n");
    printf(" *       8. 清屏                * \n");
} 

Node* initList()
{
    Node* p = (Node*)malloc(sizeof(Node));
    memset(&p->stu,0,sizeof(student));
    p->next = NULL;
    return p;
}

void save(Node* list)
 {
    Node* node = list->next;
    FILE *w =fopen("score.txt","w");
    if(w==NULL)
    {    
        printf("打开文件失败!");
        return;    
    }   
    while(node)
    {      
        fprintf(w,"\t%d\t%s\t%d\t%d\t%d\t%.2f\n",node->stu.xuehao,
                                                 node->stu.name,
                                                 node->stu.chinese,
                                                 node->stu.math,
                                                 node->stu.english,
                                                 node->stu.cj);
        node=node->next; 
        fprintf(w,"\n"); 
    }     
    printf("\n");
    fclose(w);
} 

void read(Node* list)
{
    Node* node = list;
    Node *q;
    q=(Node*)malloc(sizeof(Node));
     if(node==NULL)
         return;
     FILE *r=fopen("score.txt","r");
     if(r==NULL)
     {
         printf("打开文件失败!\n");
         return;
    }
     while(fscanf(r,"\t%d\t%s\t%d\t%d\t%d\t%.2f\n",&q->stu.xuehao,
                                                  &q->stu.name,
                                                  &q->stu.chinese,
                                                  &q->stu.math,
                                                  &q->stu.english,
                                                  &q->stu.cj)!=EOF)
    {
        node->next=q;
        node=q;
        fscanf(r,"\n");
        q=(Node*)malloc(sizeof(Node));
    }
    node->next=NULL;
    fclose(r);
}

void addStudent(Node* list)
{
    Node* node = (Node*)malloc(sizeof(Node));
    memset(&node->stu,0,sizeof(student));
    
    node->stu.xuehao = list->stu.chinese + 1000;
    printf("请输入姓名:");
    scanf("%s",node->stu.name);
    printf("请输入语文成绩:");
    scanf("%d",&node->stu.chinese);
    printf("请输入数学成绩:");
    scanf("%d",&node->stu.math);
    printf("请输入英语成绩:");
    scanf("%d",&node->stu.english);
    
    node->next = list->next;
    list->next = node;
    list->stu.chinese++;
    printf("插入成功!\n");
    save(list);
}

void showStudent(Node* list)
{
    list = list->next;
    printf("\n");
    printf("\t%s\t%s\t%s\t%s\t%s\t%s\n%","学号","姓名","语文","数学","英语","总成绩");
    while (list)
    {
        printf("\t%d\t%s\t%d\t%d\t%d\t%.2f\n",list->stu.xuehao,
                                              list->stu.name,
                                              list->stu.chinese,
                                              list->stu.math, 
                                              list->stu.english,
                                              list->stu.cj);
        list = list->next;                                      
    }
    printf("\n");
}

void addCount(Node* list)
{
    if (list->next == NULL)
    {
        printf("没有成绩可计算!\n");
        return;
    }
    
    list = list->next;
    while (list)
    {
        list->stu.cj = list->stu.chinese + list->stu.math + list->stu.english;
        list = list->next;
    }
    printf("计算完毕!\n");
    save(list);
}

void sortBycj(Node* list)
{
    if (list->next == NULL)
    {
        printf("没有成绩可排序!\n");
        return;
    }
    Node* sortedList = initList();
    Node* current = list->next;
    
    while (current)
    {
        Node* pre = current->next;
        Node* ptr = sortedList;
        
        while(ptr)
        {
            if (ptr->next == NULL || current->stu.cj < ptr->next->stu.cj)
            {
                current->next = ptr->next;
                ptr->next = current;
                sortedList->stu.chinese++;
                break;
            }
            else
            {
                ptr = ptr->next;
            }
        }
        current = pre;
    }
    list->stu = sortedList->stu;
    list->next = sortedList->next;
    free(sortedList);
    sortedList = NULL;
    printf("排序完毕!\n");
    save(list);
}

void searchStudent(Node* list)
{
    printf("请输入要查找的学号:");
    if (list->next == NULL)
    {
        printf("没有信息可查询!\n");
        return;
    }
    
    int num;
    scanf("%d",&num);
    getchar();
    list = list->next;
    while (list)
    {
        if (num == list->stu.xuehao)
        {
            printf("\n");
            printf("\t%s\t%s\t%s\t%s\t%s\t%s\n%","学号","姓名","语文","数学","英语","总成绩");
            printf("\t%d\t%s\t%d\t%d\t%d\t%.2f\n",list->stu.xuehao,
                                              list->stu.name,
                                              list->stu.chinese,
                                              list->stu.math, 
                                              list->stu.english,
                                              list->stu.cj);
            printf("\n");
            return;
        }
        list = list->next;
    }
    printf("学生信息不存在!\n");
}

void deleteStudent(Node* list)
{
    printf("请输入要删除的学号:\n"); 
    if (list->next == NULL)
    {
        printf("没有信息可删除!\n");
        return;
    }
    int xuehao;
    Node* pre = list;
    Node* current = list->next;
    scanf("%d",&xuehao);
    getchar();
    
    while (current)
    {
        if (current->stu.xuehao == xuehao)
        {
            pre->next = current->next;
            free(current);
            current = NULL;
            printf("已删除!\n");
            list->stu.chinese--;
            return;
        }
        pre = current;
        current = current->next;
    }
    printf("学生信息不存在!\n");
    save(list);
}

void modifyStudent(Node* list)
{
    if (list->next == NULL)
    {
        printf("没有信息可修改!\n");
        return;
    }
    int xuehao;
    printf("请输入要修改的学号:\n");
    scanf("%d",&xuehao);
    getchar();
    list = list->next;
    while (list)
    {
        if (list->stu.xuehao == xuehao)
        {
            printf("请输入姓名:\n");
            scanf("%s",list->stu.name);
            printf("请输入语文成绩:");
            scanf("%d",&list->stu.chinese);
            printf("请输入数学成绩:");
            scanf("%d",&list->stu.math);
            printf("请输入英语成绩:");
            scanf("%d",&list->stu.english);
            printf("修改成功!\n");
            return;
        }
        list = list->next;
    }
    printf("学生信息不存在!\n");
    save(list);
}

int main()
{
    int input;
    
    Node* list = initList();
    read(list);
    while(1)
    {
        menu();
        printf("请输入:");
        scanf("%d",&input);
        getchar();
        switch(input)
        {
            case 1:    
                addStudent(list);
                break;
            case 2:  
                showStudent(list);
                break;  
            case 3:  
                addCount(list);
                break;
            case 4:  
                sortBycj(list);
                break;
            case 5:  
                searchStudent(list);
                break;
            case 6:  
                deleteStudent(list);
                break;
            case 7:  
                modifyStudent(list);
                break;
            case 8:  
                system("cls");
                break;
            default:
                printf("输入指令有误!\n");
                break;
        }
    }
    return 0;
} 
  • 写回答

2条回答 默认 最新

  • 摆烂的程序员阿轩. 2023-10-08 19:34
    关注

    参考gpt
    存盘可以使用文件操作,将数据结构存储到文本文件中。在代码中已经定义了两个函数:save()read()用来保存和读取数据。在save()函数中,通过打开文件,将链表中的数据逐个输出到文本文件中。在read()函数中,通过打开文件,逐行读取文本文件中的数据,生成一个新的链表。代码如下:

    
    void save(Node* list)
     {
        Node* node = list->next;
        FILE *w =fopen("score.txt","w");
        if(w==NULL)
        {    
            printf("打开文件失败!");
            return;    
        }   
        while(node)
        {      
            fprintf(w,"\t%d\t%s\t%d\t%d\t%d\t%.2f\n",node->stu.xuehao,
                                                     node->stu.name,
                                                     node->stu.chinese,
                                                     node->stu.math,
                                                     node->stu.english,
                                                     node->stu.cj);
            node=node->next; 
            fprintf(w,"\n"); 
        }     
        printf("\n");
        fclose(w);
    } 
    
    void read(Node* list)
    {
        Node* node = list;
        Node *q;
        q=(Node*)malloc(sizeof(Node));
         if(node==NULL)
             return;
         FILE *r=fopen("score.txt","r");
         if(r==NULL)
         {
             printf("打开文件失败!\n");
             return;
        }
         while(fscanf(r,"\t%d\t%s\t%d\t%d\t%d\t%.2f\n",&q->stu.xuehao,
                                                      &q->stu.name,
                                                      &q->stu.chinese,
                                                      &q->stu.math,
                                                      &q->stu.english,
                                                      &q->stu.cj)!=EOF)
        {
            node->next=q;
            node=q;
            fscanf(r,"\n");
            q=(Node*)malloc(sizeof(Node));
        }
        node->next=NULL;
        fclose(r);
    }
    

    可以在程序退出前调用save()将数据存储到文本文件中,再次运行程序时,调用read()函数读取文本文件中的数据生成链表结构。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月8日

悬赏问题

  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题