LIUEUX 2022-06-24 20:25 采纳率: 50%
浏览 54

我用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("系统中没有所要删除的学生信息"); 
            }
        }
    } 
    }
}
  • 写回答

4条回答 默认 最新

  • Hann Yang 优质创作者: 编程框架技术领域 2022-06-24 22:51
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 6月24日