我用devC++写的,无法多次插入数据,插入两个数据就结束了,但是在部分人的电脑上却可以正常使用

img


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct student{
    int num;
    int scores[3];
    char name[20];
    double average; 
    struct student *next;
    
}Node,*List; 

Node *CreateHead();
void InsertNode(List head);
void Show(List head);
void modify(List head);
void Search(List head);
void sort(List head);
void deleteMsg(List head);
int main(int argc, char *argv[]) {
    int i;
    Node *h = (Node*)malloc(sizeof(Node));
    h = CreateHead();
    while(1){
        printf("学生管理系统(可输入汉字)\n");
        printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
        printf("1输入学生数据\t\t");
        printf("2修改学生数据\t\t");
        printf("3查找学生成绩\n");
        printf("4排列学生数据\t\t");
        printf("5保存学生成绩\t\t");
        printf("6删除学生资料\n");
        printf("7显示学生资料\t\t");
        printf("0结束程序\n");
        printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
         printf("操作方式:");
         scanf("%d",&i);         
         switch(i){
             case 1:
                 InsertNode(h);
                 break;
             case 2:
                 modify(h);
                 break;
             case 3:
                 Search(h);
                 break;
            case 4:    
                sort(h);
                break;
            case 5:
                
                break;
            case 6:
                deleteMsg(h); 
                break;
            case 7:
                Show(h);
                break;
            case 0:
                printf("退出了学生管理系统"); 
                exit(0);
                break;
            default:
                printf("输入错误,请重新输入\n");    
                break;
         }
    }
    return 0;
}
void add(List temp){
    printf("请输入学生学号:\n");
    scanf("%d",&temp->num);
    printf("请输入学生姓名:\n");
    scanf("%s",&temp->name);
    printf("请输入学生语文成绩:\n");
    scanf("%d",&temp->scores[0]);
    printf("请输入学生数学成绩:\n");
    scanf("%d",&temp->scores[1]);
    printf("请输入学生英语成绩:\n");
    scanf("%d",&temp->scores[2]);
}
Node *CreateHead(){
    List head = (List)malloc(sizeof(Node));
    head->next = NULL;
    head->num = 0;
    return head;
}
void InsertNode(List head){
    Node *node = head;
    Node *temp = (Node*)malloc(sizeof(Node)); 
    add(temp);
    while(node->next != NULL){
        node = node->next;
}
    node->next = temp;
} 
void Show(List head){
    if(head->next == NULL){
        printf("学生为空,没有数据!!!\n"); 
    }else{
        List temp = head->next;
        double average,sum=0;
        printf("学号\t\t姓名\t\t语文成绩\t数学成绩\t英语成绩\t个人平均成绩\n");
        while(temp != NULL){
            for(int i = 0;i < 3;i++){
                sum += temp->scores[i];
            }
            temp->average = sum/3;
            printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,temp->scores[0],temp->scores[1],
                    temp->scores[2],temp->average);
            temp = temp->next;
        }
    }
}
void modify(List head){
    if(head->next == NULL){
        printf("学生为空,没有数据!!!\n"); 
    }else
    {
        int nums;
        printf("请输入你要修改的学生学号:");
        scanf("%d",&nums);
        Node* temp = head->next; 
        while(temp != NULL){
            if(temp->num == nums){
                add(temp);
                break;
            }else{
                temp = temp->next;
                if(temp == NULL){
                    printf("系统中未存储此同学信息!");
                    break; 
                }
            }
        }
    }
    }
//            int num,i=0,ch,ma,en;
//    char str[20];    
//    printf("请输入你要修改的学生学号:");
//    scanf("%d",&num);
//    Node* temp = head;
//    while(temp->next != NULL){
//        if(temp->next->num == num){
//            do{
//                printf("请输入你要查找的内容\n");
//                printf("1.姓名\t");
//                printf("2.语文成绩\t");
//                printf("3.数学成绩\t");
//                printf("4.英语成绩\t");
//                printf("5.退出修改\n");
//                scanf("%d",&i);
//                switch(i){
//                    case 1:
//                        printf("请输入修改的名称:");
//                        scanf("%s",&str); 
//                        strcpy(temp->name,str);
//                        break;
//                    case 2: 
//                        printf("请输入修改的语文成绩:");
//                        scanf("%d",&ch); 
//                        temp->scores[0] = ch;
//                        break;
//                    case 3:
//                        printf("请输入修改的数学成绩:");
//                        scanf("%d",&ma); 
//                        temp->scores[1] = ch;
//                        break;
//                    case 4:
//                        printf("请输入修改的英语成绩:");
//                        scanf("%d",&en); 
//                        temp->scores[2] = ch;
//                        break;
//                    case 5:
//                        printf("修改功能已退出");
//                        exit(0);
//                    default:
//                        printf("输入错误,请正确输入1~5\n");
//                        break; 
//                } 
//            }while(1);
//        }else{
//            temp = temp->next;
//        }
//    } 


void Search(List head){
    if(head->next == NULL){
        printf("链表为空!\n");
        return; 
    }else{
    int num,sum=0;
    printf("请输入要查找的学生学号:");
    scanf("%d",&num);
    Node* temp = head->next; 
    while(temp != NULL){
        if(temp->num == num){
            for(int i = 0;i < 3;i++){
            sum += temp->scores[i];
            }
            temp->average = sum/3;
            printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,temp->scores[0],temp->scores[1],
                    temp->scores[2],temp->average);
            break;
        }else{
            temp = temp->next;
            if(temp == NULL){
                printf("系统中没有所要的学生信息"); 
            }
        }
    }
}
}

void sort(List head){
    if(head->next == NULL){
        printf("链表为空!\n");
        return; 
    }else{
    Node* temp = head->next;
    Node* p;
    Node* p1 = head; 
    while(temp != NULL){
        p = temp->next;
        if(temp->average < p->average){
            p1->next = p;
            temp->next = p->next;
            p->next = temp;
        }    
        temp = temp->next;
        p1 = p1->next; 
    }
}
}
void deleteMsg(List head){
        if(head->next == NULL){
        printf("学生为空,没有数据!!!\n"); 
    }else
    {
    int num;
    printf("请输入要删除的学生学号:");
    scanf("%d",&num);
    Node* temp = head->next;
    Node* p = head;
    while(temp != NULL){
        if(temp->num == num){
            p->next = temp->next;
            printf("删除成功!"); 
            break;
        }else{
            temp = temp->next;
            p = p->next;
            if(temp == NULL){
                printf("系统中没有所要删除的学生信息"); 
            }
        }
    } 
    }
}

发现两个无关紧要的错误:
第77号: scanf("%s",&temp->name); 去掉&,name[]是字符数组, name已是地址,所以不用取址符&
第105行 删除average, 此变量没用过,不需要

修改完善如下,修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct student{
    int num;
    int scores[3];
    char name[20];
    double average;
    struct student *next;
}Node,*List;

Node *CreateHead();
void InsertNode(List head);
void Show(List head);
void modify(List head);
void Search(List head);
void sort(List head);
void save_file(List head); //修改
void deleteMsg(List head);
int main(int argc, char *argv[]) {
    int i;
    Node *h = NULL; //(Node*)malloc(sizeof(Node));
    h = CreateHead();
    while(1){
        printf("学生管理系统(可输入汉字)\n");
        printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
        printf("1 输入学生数据\t\t");
        printf("2 修改学生数据\t\t");
        printf("3 查找学生成绩\n");
        printf("4 排列学生数据\t\t");
        printf("5 保存学生成绩\t\t");
        printf("6 删除学生资料\n");
        printf("7 显示学生资料\t\t");
        printf("0 结束程序\n");
        printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
        printf("操作方式(0-7):");
        scanf("%d",&i);
        switch(i){
             case 1:
                 InsertNode(h);
                 break;
             case 2:
                 modify(h);
                 break;
             case 3:
                 Search(h);
                 break;
            case 4:
                 sort(h);
                 break;
            case 5:
                 save_file(h); //修改
                 break;
            case 6:
                 deleteMsg(h);
                 break;
            case 7:
                 Show(h);
                 break;
            case 0:
                 printf("退出了学生管理系统.\n");
                 exit(0);
                 break;
            default:
                 printf("输入错误,请重新输入!\n");
                 break;
        }
    }
    return 0;
}
void add(List temp){
    printf("请输入学生学号:\n");
    scanf("%d",&temp->num);
    printf("请输入学生姓名:\n");
    scanf("%s",temp->name);      //scanf("%s",&temp->name); 修改
    printf("请输入学生语文成绩:\n");
    scanf("%d",&temp->scores[0]);
    printf("请输入学生数学成绩:\n");
    scanf("%d",&temp->scores[1]);
    printf("请输入学生英语成绩:\n");
    scanf("%d",&temp->scores[2]);
    temp->average = (temp->scores[0]+temp->scores[1]+temp->scores[2])/3.0;//修改
}
Node *CreateHead(){
    List head = (List)malloc(sizeof(Node));
    head->next = NULL;
    head->num = 0;
    return head;
}
void InsertNode(List head){
    Node *node = head;
    Node *temp = (Node*)malloc(sizeof(Node));
    temp->next = NULL;   //修改
    add(temp);
    while(node->next != NULL){
        node = node->next;
    }
    node->next = temp;
}
void Show(List head){
    if(head->next == NULL){
        printf("学生为空,没有数据!!!\n"); 
    }else{
        List temp = head->next;
        //double average,sum=0;  修改
        printf("学号\t\t姓名\t\t语文成绩\t数学成绩\t英语成绩\t个人平均成绩\n");
        while(temp != NULL){
            //for(i = 0,sum = 0;i < 3; i++){ //修改
            //    sum += temp->scores[i];
            //}
            //temp->average = sum/3;
            printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,
                   temp->scores[0],temp->scores[1],temp->scores[2],temp->average);
            temp = temp->next;
        }
    }
}
void modify(List head){
    if(head->next == NULL){
        printf("学生为空,没有数据!!!\n"); 
    }
    else{
        int nums;
        printf("请输入你要修改的学生学号:");
        scanf("%d",&nums);
        Node* temp = head->next; 
        while(temp != NULL){
            if(temp->num == nums){
                add(temp);
                break;
            }else{
                temp = temp->next;
                if(temp == NULL){
                    printf("系统中未存储此同学信息!");
                    break;
                }
            }
        }
    }
}
//            int num,i=0,ch,ma,en;
//    char str[20];    
//    printf("请输入你要修改的学生学号:");
//    scanf("%d",&num);
//    Node* temp = head;
//    while(temp->next != NULL){
//        if(temp->next->num == num){
//            do{
//                printf("请输入你要查找的内容\n");
//                printf("1.姓名\t");
//                printf("2.语文成绩\t");
//                printf("3.数学成绩\t");
//                printf("4.英语成绩\t");
//                printf("5.退出修改\n");
//                scanf("%d",&i);
//                switch(i){
//                    case 1:
//                        printf("请输入修改的名称:");
//                        scanf("%s",&str);
//                        strcpy(temp->name,str);
//                        break;
//                    case 2: 
//                        printf("请输入修改的语文成绩:");
//                        scanf("%d",&ch); 
//                        temp->scores[0] = ch;
//                        break;
//                    case 3:
//                        printf("请输入修改的数学成绩:");
//                        scanf("%d",&ma); 
//                        temp->scores[1] = ch;
//                        break;
//                    case 4:
//                        printf("请输入修改的英语成绩:");
//                        scanf("%d",&en); 
//                        temp->scores[2] = ch;
//                        break;
//                    case 5:
//                        printf("修改功能已退出");
//                        exit(0);
//                    default:
//                        printf("输入错误,请正确输入1~5\n");
//                        break;
//                }
//            }while(1);
//        }else{
//            temp = temp->next;
//        }
//    }
void Search(List head){
    if(head->next == NULL){
        printf("链表为空!\n");
        return;
    }
    else{
        int num,sum=0;
        printf("请输入要查找的学生学号:");
        scanf("%d",&num);
        Node* temp = head->next;
        while(temp != NULL){
            if(temp->num == num){
               //for(int i = 0;i < 3; i++){    //修改
               //   sum += temp->scores[i];
               //}
               //temp->average = sum/3;
               printf("学号\t\t姓名\t\t语文成绩\t数学成绩\t英语成绩\t个人平均成绩\n");
               printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,
                      temp->scores[0],temp->scores[1],temp->scores[2],temp->average);
               break;
            }
            else{
               temp = temp->next;
               if(temp == NULL){
                  printf("系统中没有所要的学生信息\n");
               }
            }
        }
    }
}

void sort(List head){     //修改
    if(head->next == NULL){
        printf("链表为空!\n");
        return;
    }
    else{
        Node* temp = NULL,* p = NULL,* p1 = NULL, *tail = NULL; //修改
        while((head->next->next) != tail){   //修改
              p1 = head;
              temp = head->next;
              while(temp->next != tail){     //修改
                    p = temp->next;
                    if(temp->average < p->average){
                        p1->next = p;
                        temp->next = p->next;
                        p->next = temp;
                        temp = p1->next;    //修改
                    }
                    temp = temp->next;
                    p1 = p1->next;
              }
              tail = temp; //修改
        }
    }
}
void deleteMsg(List head){
        if(head->next == NULL){
        printf("学生为空,没有数据!!!\n");
    }
    else{
        int num;
        printf("请输入要删除的学生学号:");
        scanf("%d",&num);
        Node* temp = head->next;
        Node* p = head;
        while(temp != NULL){
            if(temp->num == num){
               p->next = temp->next;
               free(temp);       //修改
               printf("删除成功!");
               break;
            }
            else{
               p = temp;       //修改
               temp = temp->next;
                               //p = p->next; 修改
               if(temp == NULL){
                  printf("系统中没有所要删除的学生信息\n");
               }
            }
        }
    }
}

void save_file(List head)   //修改
{
    if(head->next == NULL){
       printf("链表为空!\n");
       return;
    }
    else{
       int i;
       FILE* fp;
       List temp = head;
       fp = fopen("student.txt","w");
       if(fp == NULL)  return;
       while(temp->next){
            fprintf(fp,"%d %s",temp->next->num,temp->next->name);
            for(i=0;i<3;i++)
                fprintf(fp," %d",temp->next->scores[i]);
            fprintf(fp," %lf\n", temp->next->average);
            temp = temp->next;
       }
       fclose(fp);
    }
}

所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。▼ http://bbs.csdn.net/topics/391975224

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^