m0_60333810 2021-10-22 19:38 采纳率: 90%
浏览 20
已结题

学生信息管理的数据结构问题

程序写完之后运行正常就是在执行显示所有数据这个命令时直接结束程序了有点不理解,源码和图贴在下面了



#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100

typedef int Status;
typedef int ElemType;
typedef struct
{
    int number;
    char name[10];
    int score;
}Student;
typedef struct LNode
{
    Student data;
    struct LNode* next;
}LNode, * LinkList;

Status Number()
{
    int a;
    while (TRUE)
    {
        while (scanf("%d", &a) != 1)
        {
            printf("输入错误请重新输入\n");
            scanf("%*[^\n]");
            scanf("%*c");
        }
        if (a >= 0)
            return a;
        printf("请重新输入\n");
    }
    return OK;
}

Status CreatListHead(LinkList L, int n)
{
    LinkList p, q;
    int i, k;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    q = L;
    if (n == 0)
    {
        return OK;
    }
    printf("请按顺序输入学生的姓名、学号、成绩(每次以回车结束)\n");
    for (i = 0; i < n; i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        scanf("%s", p->data.name);
        p->data.number = Number();
        p->data.score = Number();
        for (k = 0; k < i; k++)
        {
            if (q->data.number == p->data.number)
            {
                printf("有重复,请重新输入\n");
                scanf("%s", p->data.name);
                p->data.number = Number();
                p->data.score = Number();
                continue;
            }
            q = q->next;
        }
        p->next = L->next;
        L->next = p;
        q = L->next;
    }
    return OK;
}

Status GetAllElem(LinkList L)
{
    if (!L)
    {
        printf("无数据\n");
        return ERROR;
    }
    LinkList p;
    p = L->next;
    while (p != NULL)
    {

        printf("学号:%d 姓名:%s 成绩:%d\n", p->data.number, p->data.name, p->data.score);
        p = p->next;
    }
    return OK;
}

Status ByName(LinkList L, char x[])
{
    LinkList p;
    p = L->next;
    char a[10];
    while (p != NULL)
    {
        if (strcmp(x, p->data.name) == 0)
        {
            printf("该学生的成绩为%d\n", p->data.score);
            printf("该学生的学号为%d\n", p->data.number);
            return OK;
        }
        p = p->next;
    }
    printf("不存在该学生\n");
    printf("请重新输入(如退出则输入:8080)\n");
    scanf("%s", a);
    if (strcmp(a, "8080") == 0)
        return OK;
    ByName(L, a);
    return ERROR;
}

Status BySpot(LinkList L, int x)
{
    LinkList p;
    int i = 1;
    int a;
    p = L->next;
    while (p && i < x)
    {
        p = p->next;
        i++;
    }
    if (!p || i > x)
    {
        printf("不存在\n");
        printf("请重新输入(如退出则输入:8080)\n");
        a = Number();
        if (a == 8080)
            return OK;
        BySpot(L, a);
        return ERROR;
    }
    printf("该学生学号为%d\n", p->data.number);
    printf("该学生姓名为%s\n", p->data.name);
    printf("该学生成绩为%d\n", p->data.score);
    return OK;
}

Status ListInsert(LinkList L, int x)
{
    int i = 0;
    int a;
    LinkList p, s, q;
    p = L;
    q = L->next;
    while (p && i < x)
    {
        p = p->next;
        i++;
    }
    if (!p || i > x)
    {
        printf("插入位置错误\n");
        printf("请重新输入(如退出则输入:8080)\n");
        a = Number();
        if (a == 8080)
            return OK;
        ListInsert(L, a);
        return ERROR;
    }
    s = (LinkList)malloc(sizeof(LNode));
    printf("请按顺序输入学生的姓名、学号、成绩(每次以回车结束)\n");
    while (TRUE)
    {
        scanf("%s", s->data.name);
        s->data.number = Number();
        s->data.score = Number();
        while (q != NULL)
        {
            if (q->data.number == s->data.number)
            {
                printf("有重复,请重新输入\n");
                scanf("%*[^\n]");
                scanf("%*c");
                break;
            }
            q = q->next;
            while (q == NULL)
            {
                s->next = p->next;
                p->next = s;
                return OK;
            }
        }
    }
}

Status ListDelete(LinkList L, int x)
{
    int j, a;
    LinkList p, q;
    p = L;
    j = 1;
    while (p && j < x)
    {
        p = p->next;
        j++;
    }
    if (!p || j > x)
    {
        printf("不存在\n");
        printf("请重新输入(如退出则输入:8080)\n");
        a = Number();
        if (a == 8080)
            return OK;
        ListDelete(L, a);
        return ERROR;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return OK;
}

Status GetLength(LinkList L)
{
    int i = 0;
    LinkList p;
    p = L->next;
    if (!p)
    {
        printf("链表为空\n");
        return OK;
    }
    while (p)
    {
        i++;
        p = p->next;
    }
    printf("链表长度为%d\n", i);
    return i;
}

int main()
{
    LinkList L;
    int n, k, d;
    char a[10];
    printf("请输入学生个数(以回车结束)\n");
    n = Number();
    CreatListHead(L, n);
    printf("功能:\n");
    printf("输入1:按顺序显示所有数据\n");
    printf("输入2:输入姓名进行查找\n");
    printf("输入3:输入位置进行查找\n");
    printf("输入4:插入数据\n");
    printf("输入5:输入位置进行删除\n");
    printf("输入6:输入链表元素个数\n");
    while (TRUE)
    {
        printf("请输入要执行什么功能\n");
        d = Number();
        switch (d)
        {
        case 1:
            if (!L->next)
            {
                printf("无数据\n");
                printf("\n");
                break;
            }GetAllElem(L);
            printf("\n");
            break;
        case 2:
            if (!L->next)
            {
                printf("无数据\n");
                break;
            }
            printf("请输入要查找的姓名\n");
            scanf("%s", a);
            ByName(L, a);
            printf("\n");
            break;
        case 3:
            if (!L->next)
            {
                printf("无数据\n");
                printf("\n");
                break;
            }
            printf("请输入要查找第几个\n");
            k = Number();
            BySpot(L, k);
            printf("\n");
            break;
        case 4:
            printf("请输入要插入第几个的后面(要插入成第一个则输入0)\n");
            if (L->next == NULL)
            {
                printf("无数据,插入第一个\n");
                CreatListHead(L, 1);
                break;
            }
            printf("请输入要插入第几个的后面(要插入成第一个则输入0)\n");
            k = Number();
            ListInsert(L, k);
            printf("\n");
            break;
        case 5:
            if (!L->next)
            {
                printf("无数据\n");
                printf("\n");
                break;
            }
            printf("请输入删除第几个\n");
            k = Number();
            ListDelete(L, k);
            printf("\n");
            break;
        case 6:
            GetLength(L);
            printf("\n");
            break;
        default:
            printf("不存在请重新输入\n");
        }
    }
    return OK;
}



  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月30日
    • 修改了问题 10月22日
    • 修改了问题 10月22日
    • 修改了问题 10月22日
    • 展开全部

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题