2301_79991893 2023-11-28 22:39 采纳率: 40%
浏览 9
已结题

为什么在输入第一个学生的信息之后就显示异常了呢 应该怎么修改


#define ST struct student
#define LEN sizeof(ST)
#define MAX 20
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct student
{
    char num[MAX];
    char name[MAX];
    char sex;
    int score1[MAX], score2[MAX], score3[MAX], score4[MAX];
    char addr[MAX];
    struct student* next;
};
ST* creat()
{
    ST* head = NULL, * p1 = NULL, * p2 = NULL;
    int n = 0;
    p1 = p2 = (ST*)malloc(sizeof(ST));
    if (p1 == NULL)
    {
        printf("Can't get memory!\n");
        return NULL;
    }
    printf("输入学生信息:\n");
    while (scanf_s("%s %s %c %d %d %d %d %s", p1->num, p1->name, &p1->sex,
        &p1->score1, &p1->score2, &p1->score3, &p1->score4, p1->addr) != NULL)
    {
        n++;
        if (n == 1)
        {
            head = p1;
        }
        else {
            p2->next = p1;
        }
        p2 = p1;
        if (p1 == NULL)
        {
            printf("Can't get memory!\n");
            return NULL;
        }
    }
    p2->next = NULL;
    return head;
}
void print(ST* head)
{
    ST* p = head;
    if (head != NULL)
    {
        do {
            printf("%s %s %c %d %d %d %d %s\n", p->num, p->name, p->sex,
                p->score1, p->score2, p->score3, p->score4, p->addr);
            p = p->next;
        } while (p != NULL);
    }
}
ST* insert(ST* head, char num[], ST* newstu)
{
    ST* p;
    p = head;
    if (head == NULL)
    {
        head = newstu;
        newstu->next = NULL;
        return(head);
    }
    if (strcmp(num, p->num) < 0)
    {
        newstu->next = p;
        head = newstu;
        return(head);
    }
    while (p->next != NULL && strcmp(num, p->next->num) > 0)
    {
        p = p->next;
    }
    newstu->next = p->next;
    p->next = newstu;
    return(head);
}
ST* del(ST* head, char num[])
{
    ST* p1, * p2=NULL;
    if (head == NULL)
    {
        printf("\n链表为空\n");
        return (head);
    }
    p1 = head;
    while (strcmp(num, p1->num) != 0 && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (strcmp(num, p1->num) == 0)
    {
        if (p1 == head)
            head = p1->next;
        else p2->next = p1->next;
        free(p1);
    }
    else
        printf("没找到%s号\n", num);
    return (head);
}
int main()
{
    ST* head, * newstu;
    char num[MAX];
    int choice;
    head = creat();
    printf("输入要进行的操作:\n");
    printf("1.插入\n");
    printf("2.删除\n");
    scanf_s("%d", &choice);
    switch (choice)
    {
    case 1:
        newstu = (ST*)malloc(sizeof(ST));
        printf("输入要插入的学生信息:\n");
        scanf_s("%s %s %c %d %d %d %d %s", newstu->num, newstu->name, &newstu->sex,
            &newstu->score1, &newstu->score2, &newstu->score3, &newstu->score4, newstu->addr);
        head = insert(head, newstu->num, newstu);
        printf("插入后的链表为:\n");
        print(head);
        break;
    case 2:
        printf("输入要删除的学生学号:\n");
        scanf_s("%s", num);
        head = del(head, num);
        printf("删除后的链表为:\n");
        print(head);
        break;
    default:
        printf("输入错误!\n");
        break;
    }
    return 0;
}

为什么在输入第一个学生的信息之后就显示异常了呢 应该怎么修改?期待回复 感谢!

  • 写回答

3条回答 默认 最新

  • 关注

    结构体定义错误,
    int score1[MAX], score2[MAX], score3[MAX], score4[MAX];
    这个改成
    int score1, score2, score3, score4;,或者用数组 int score[4];
    create中还有错误,p1在while循环中需要重新malloc,代码修改如下:

    
    #define ST struct student
    #define LEN sizeof(ST)
    #define MAX 20
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    struct student
    {
        char num[MAX];
        char name[MAX];
        char sex;
        int score[4];//, score2, score3, score4;
        //int score1[MAX], score2[MAX], score3[MAX], score4[MAX];
        char addr[MAX];
        struct student* next;
    };
    ST* creat()
    {
        ST* head = NULL, * p1 = NULL, * p2 = NULL;
        int n = 0;
        p1 = (ST*)malloc(sizeof(ST));
        if (p1 == NULL)
        {
            printf("Can't get memory!\n");
            return NULL;
        }
        printf("输入学生信息:\n");
        while (scanf_s("%s %s %c %d %d %d %d %s", p1->num,MAX, p1->name,MAX, &p1->sex,1,
            &p1->score[0], &p1->score[1], &p1->score[2], &p1->score[3], p1->addr,MAX) != EOF)
        {
            n++;
            if (n == 1)
            {
                head = p1;
            }
            else {
                p2->next = p1;
            }
            p2 = p1;
            p1 = (ST*)malloc(sizeof(ST));
            if (p1 == NULL)
            {
                printf("Can't get memory!\n");
                return NULL;
            }
        }
        p2->next = NULL;
        free(p1);
        return head;
    }
    void print(ST* head)
    {
        ST* p = head;
        while (p != NULL)
        {
            printf("%s %s %c %d %d %d %d %s\n", p->num, p->name, p->sex,
                p->score[0], p->score[1], p->score[2], p->score[3], p->addr);
            p = p->next;
        }
    }
    ST* insert(ST* head, char num[], ST* newstu)
    {
        ST* p;
        p = head;
        if (head == NULL)
        {
            head = newstu;
            newstu->next = NULL;
            return(head);
        }
        if (strcmp(num, p->num) < 0)
        {
            newstu->next = p;
            head = newstu;
            return(head);
        }
        while (p->next != NULL && strcmp(num, p->next->num) > 0)
        {
            p = p->next;
        }
        newstu->next = p->next;
        p->next = newstu;
        return(head);
    }
    ST* del(ST* head, char num[])
    {
        ST* p1, * p2=NULL;
        if (head == NULL)
        {
            printf("\n链表为空\n");
            return (head);
        }
        if(strcmp(head->num,num)==0)
        {
            p1 = head->next;
            free(head);
            head = p1;
            return head;
        }
        p1 = head;
        while ( p1->next != NULL && strcmp(num, p1->next->num) != 0 )
        {
            p1 = p1->next;
        }
        if (strcmp(num, p1->next->num) == 0)
        {
            p2 = p1->next;
            p1->next = p2->next;
            free(p2);
        }
        else
            printf("没找到%s号\n", num);
        return (head);
    }
    int main()
    {
        ST* head, * newstu;
        char num[MAX];
        int choice;
        head = creat();
        
        printf("输入要进行的操作:\n");
        printf("1.插入\n");
        printf("2.删除\n");
        scanf_s("%d", &choice);
        switch (choice)
        {
        case 1:
            newstu = (ST*)malloc(sizeof(ST));
            printf("输入要插入的学生信息:\n");
            scanf_s("%s %s %c %d %d %d %d %s", newstu->num, MAX,newstu->name,MAX, &newstu->sex,1,
                &newstu->score[0], &newstu->score[1], &newstu->score[2], &newstu->score[3], newstu->addr,MAX);
            head = insert(head, newstu->num, newstu);
            printf("插入后的链表为:\n");
            print(head);
            break;
        case 2:
            printf("输入要删除的学生学号:\n");
            scanf_s("%s", num,MAX);
            head = del(head, num);
            printf("删除后的链表为:\n");
            print(head);
            break;
        default:
            printf("输入错误!\n");
            break;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日
  • 创建了问题 11月28日