So 2018-11-30 13:30
浏览 383

用双向链表制作学生成绩管理系统,从文件下载记录输出乱码,排序没有显示结果?

#include<stdio.h.>
#include<string.h> 
#include<malloc.h>
#include<stdlib.h>
typedef struct student{
    int num;
    char name[10];
    int math;
    int Chinese;
    int English;
    int total;
}stu;     /*建立学生成绩信息结构体;*/ 
typedef struct  dlnode 
{  
    stu data;  
   struct dlnode *prior;  
   struct dlnode *next; 
}dnode;      /*建立双向链表结构体;*/
dnode *head;
void enter(void)//输入学生成绩
{  
    dnode *p,*rear;  
    char flag='Y';     
    head=(dnode *)malloc(sizeof(dnode));   
    rear=head;  
    head->next=head;  
    head->prior=head;    /*建立双链表空头节点;*/
    while(flag=='Y'||flag=='y')  
{   
        p=(dnode *)malloc(sizeof(dnode));   
        printf("学号:");   
        scanf("%d/n",&p->data.num);
        printf("姓名:");
        scanf("%s/n",&p->data.name);
        printf("语文成绩:");
        scanf("%d/n",&p->data.Chinese);
        printf("数学成绩:");
        scanf("%d/n",&p->data.math);
        printf("英语成绩:");
        scanf("%d",&p->data.English);
        p->data.total=(p->data.Chinese+p->data.English+p->data.math);
        rear->next=p;   
        p->prior=rear;   
        rear=p;   
        p->next=head;   /*向双链表中动态增加节点数据;*/ 
        printf("继续输入吗?(Y/N)\n");   
        scanf("%s",&flag);  
}  
printf("\n");
}
void load(dnode *head) //从文件中读取
{ 
    FILE *fp; 
    int n,i; 
    dnode *p,*rear; 
    rear=head; 
    head->next=head; 
    head->prior=head; 
    if((fp=fopen("file.txt","rb"))==NULL) 
    { 
        printf("打开文件失败!!!\n"); 
        exit(0); 
    } 
    fscanf(fp,"%d",&n); 
    for(i=0;i<n;i++) 
    { 
        p=(dnode *)malloc(sizeof(dnode)); 
        fscanf(fp,"%-5d%8s%8d%9d%9d",&p->data.num,&p->data.name,&p->data.Chinese,&p->data.math,&p->data.English); 
        rear->next=p; 
        p->prior=rear; 
        rear=p; 
        p->next=head;/*从文件中动态载入节点数据;*/ 
    } 
    fclose(fp); 
    printf("下载数据成功!!!\n\n"); 
}
void display(dnode *head) //显示所有成绩
{  
    dnode *p;  
    p=head->next;  
    printf("学号     姓名     语文     数学    英语    总分\n");   
    while(p!=head)  
    {   
        printf("%-5d%8s%8d%9d%9d%9d",p->data.num,p->data.name,p->data.Chinese,p->data.math,p->data.English,p->data.total);   
        printf("\n");      
        p=p->next;  
    } 
}
void save(dnode *head)//存盘 
{  
    FILE *fp;  
    dnode *p;  
    int n=0,i;  
    if((fp=fopen("file.txt","wb"))==NULL)  
    {   
        printf("打开文件失败!!!\n");   
        exit(1);  
}  p=head->next;  
    if(p!=head)  
    {   
        while (p!=head)   
        {    
            p=p->next;    
            n++;   
}   
        fprintf(fp,"%d",n);  /*写入节点个数;*/   
        fprintf(fp,"\r\n");  /*写入回车符;*/   
        p=head->next;   
        for(i=0;i<n;i++)   
        {    
            fprintf(fp,"%-5d%8s%8d%9d%9d",p->data.num,p->data.name,p->data.Chinese,p->data.math,p->data.English);    
            fprintf(fp,"\r\n");    
            p=p->next;   
}    /*向文件中写入节点数据;*/   
}  
    else   
        printf("Please make sure the data is not NULL!!");  
    fclose(fp);  
    printf("存盘成功!!!\n"); 
}
void sort(dnode * head)//排序
{
    dnode *p,*pre,*q;
    p=head->next->next;
    head->next->next=NULL;
    while(p!=NULL)
    {
        q=p->next;
        pre=head;
        while(pre->next!=NULL&&pre->next->data.total<p->data.total)
            pre=pre->next;
        p->next=pre->next;
        if(pre->next!=NULL)
            pre->next->prior=p;
        pre->next=p;
        p->prior=pre;
        p=q;
    }
    display(head);
}
void quit(void) //退出
{  
    exit(0); 
}
void main() 
{ 
    char flag='Y';  
    for(;;)  
    {  
        dnode *q;  
        int ch;  
        printf("学生成绩管理系统:\n");   
        printf("   输入学生成绩-----------------0\n");  
        printf("   下载纪录-----------------1\n");  
        printf("   显示所有成绩-------------2\n");  
        printf("   存盘---------------------3\n"); 
        printf("   按总分排序-------------4\n");
        printf("   退出---------------------5\n"); 
        printf("请输入数字(0~5):\n");  
        scanf("%d",&ch);
        switch(ch)  
        {  
        case 0:   enter();
            break;  
        case 1:   head=(dnode *)malloc(sizeof(dnode));   
            load(head);
            break;  
        case 2:   display(head);
            break;  
        case 3:   save(head);
            break;  
        case 4:   sort(head);
            break;
        case 5:   quit();
            break;
        default: 
            printf("警告!!!请输入数字0-5!\n");  
        }/*用SWITCH函数选择菜单;*/  
    } 
}

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 运筹学排序问题中的在线排序
    • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
    • ¥30 求一段fortran代码用IVF编译运行的结果
    • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
    • ¥15 lammps拉伸应力应变曲线分析
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败
    • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
    • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题