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 Stata 面板数据模型选择
    • ¥20 idea运行测试代码报错问题
    • ¥15 网络监控:网络故障告警通知
    • ¥15 django项目运行报编码错误
    • ¥15 请问这个是什么意思?
    • ¥15 STM32驱动继电器
    • ¥15 Windows server update services
    • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
    • ¥15 模糊pid与pid仿真结果几乎一样
    • ¥15 java的GUI的运用