鸣神组CP头子 2022-05-16 20:42 采纳率: 100%
浏览 82
已结题

大一c语言遇到问题,解决不了

问题遇到的现象和发生背景

img

问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student
{
    char name[20];
    char sex[10];
    int num;
    int clnum;
    struct Student* next;
};
struct Class
{
    char clname[20];
    int id;
    struct Student* studenthead;//学生头指针
    struct Class* next;
};
void Menu();
//下面的是与学生有关的函数
struct Class* creatnode(struct Class* p);
void Clinput(struct Class* head);
void Initiate(struct Class* p);
void Cldelete(struct Class* head);
struct Class* cldelete1(struct Class* p);
void Cldisplay(struct Class*head);
//下面的是与班级有关的函数
void Display(struct Class*head);
struct Class* Add(struct Class*head);
struct Class* Delete(struct Class*head);


void Display(struct Class*head)
{
    int count=0;
    int count1=0;
    struct Class *p;
    struct Student *o;
    for (p = head->next;p->next!=NULL;p=p->next)
    {
        count++;
    }
    //班级总数
    printf("班级总数为%d\n",count);
    if(head->next==NULL)
    {
        printf("还没添加班级呢!\n");
    }
    else
    {
        for(p=head->next;p->next!=NULL;p=p->next)
        {
            printf("该班名称%s\n",p->clname);
            for(o=head->studenthead->next;o->next!=NULL;o=o->next)
            {
                count1++;
            }
            
            printf("该班已有同学数%d\n",count1);
        }
    }
    
}

struct Class* Add(struct Class* head)
{

    struct Class *p,*q;
    if ((q=(struct Class *)malloc(sizeof(struct Class)))==NULL) exit(1);
    printf("请输入班级名称\n");
    scanf("%s",&q->clname);
    printf("请输入班号\n");
    scanf("%d",&q->id);
    for (p = head;p->next!=NULL;p=p->next);//第一个指针无数据域、尾接法、确保每次数据可以接到链表末端
    p->next=q;
    q->next=NULL;
    q->studenthead=NULL;//方便后面判断是否为第一个录入学生
    printf("信息已添加完成!\n");
    return head;


}

struct Class* Delete(struct Class*head)
{
    struct Class *p;
    struct Class *q;
    int number;
    printf("请输入要删除班级的班号\n");
    scanf("%d",&number);
    p=head;
    for(q=NULL;p;q=p,p=p->next)
    {
        if(p->id==number)
        {
            if(q)
            {
                q->next=p->next;
                free(p);
                printf("删除成功\n");
                break;
                
            }
            else//由于我们的头指针不存放数据,这步可写可不写
            {
                head=p->next;
            }
            free(p);
            printf("删除成功\n");
            break;
        }
    }
    return head;


}

void Clinput(struct Class* head)
{
    int name;
    struct Class *p;
    printf("请先输入班号。\n");
    scanf("%d",&name);
    for (p=head;p->next!=NULL;p=p->next)
    {
        if(name==p->id)
        {
            p=creatnode(p);
            return ;
        }
    }
    printf("没有这个班号,请先到2.增加班级。\n");
}
struct Class* creatnode(struct Class* p)//下面的大写P为学生链表的位置指针,小写p为班级链表的节点指针
{
    if(p->studenthead==NULL)
    {
        Initiate(p);
    }
    struct Student *P,*q;
    if ((q=(struct Student *)malloc(sizeof(struct Student)))==NULL) exit(1);
    printf("请输入学生名字\n");
    scanf("%s",&q->name);
    printf("请输入性别(male or female)\n");
    scanf("%s",&q->sex);
    printf("请输入学号\n");
    scanf("%d",&q->num);
    q->clnum=p->id;
    for (P = p->studenthead;P->next!=NULL;P=P->next);
    P->next=q;
    q->next=NULL;
    printf("学生信息已录入!\n");
    return p;

}
void Initiate(struct Class* p)
{
    p->studenthead=(struct Student*)malloc(sizeof(struct Student));
    p->studenthead->next=NULL;
}
void Cldelete(struct Class* head)
{
    int name;
    struct Class *p;
    printf("请先输入该同学所在班号\n");
    scanf("%d",&name);
    for (p = head;p->next!=NULL;p=p->next)
    {
        if(name==p->id)
        {
            p=cldelete1(p);
            return;
        }
    }
    printf("班号不存在!\n");
}
struct Class* cldelete1(struct Class* p)
{
    int num;
    struct Student *P,*q;
    printf("输入要删除同学的学号\n");
    scanf("%d",&num);
    P=p->studenthead;
    for(q=NULL;P;q=P,P=P->next)
    {
        if(p->studenthead->num==num)
        {
            if(q)
            {
                q->next=P->next;
            }
            else//由于我们的头指针不存放数据,这步可写可不写
            {
                p->studenthead=P->next;
            }
            free(P);
            break;    
            
        }
    }
    return p;
}
void Cldisplay(struct Class*head)
{
    int id;
    struct Class *p;
    struct Student *q;
    printf("请输入要显示的班级的班号\n");
    scanf("%d",&id);
    for(p = head;p->next!=NULL;p=p->next)
    {
        if(p->id==id)
        {
            if(head->studenthead->next==NULL)
            {
                printf("该班级还未录入同学\n");
            }
            else
            {
            for(q=head->studenthead->next;q->next!=NULL;q=q->next)
            {
                printf("姓名:%s 性别:%s 学号:%d\n",q->name,q->sex,q->num);
            }
            }
        }
        return;
    }
    printf("无此班级\n");
}





void Menu()
{
    printf("\n");
    printf("\n");
    printf("\n");
    printf("**************欢迎使用同学录系统(注意所有的第一步都是建立班级先哦)**************");
    printf("\n");
    printf("\n");
    printf("***********  1.显示班级列表   ***********\n");
    printf("***********  2.增加班级    ***********\n");
    printf("***********  3.删除班级    ***********\n");
    printf("***********  4.班级同学录入    ***********\n");
    printf("***********  5.班级同学删除    ***********\n");
    printf("***********  6.显示指定班级同学录    ***********\n");
    printf("***********  7.退出    ***********\n");
}



main()
{
    struct Class* Head=(struct Class*)malloc(sizeof(struct Class));
    Head->next=NULL;
    Head->studenthead=NULL;
    int choice;    
    char yes_no;
    do
    {
        Menu();
        printf("请输入指令0-7:\n");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:Display(Head);
            break;
        case 2:Head=Add(Head);
            break;
        case 3:Head=Delete(Head);
            break;
        case 4:Clinput(Head);
            break;
        case 5:Cldelete(Head);
            break;
        case 6:Cldisplay(Head);
            break;
        case 7:
            printf("感谢使用\n");
            exit(0);
            break;
        default:
            printf("输入错误,请重新输入。\n");
            break;
        }
        printf("是否继续 Y or N?\n");
        do
        {
            scanf("%c",&yes_no);
        }
        while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
    }
    while(yes_no=='Y'||yes_no=='y');
    


    return 0;    
}


运行结果及报错内容

运行不到题目想要的结果,第一个输进去的值会不见

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • 吕布辕门 后端领域新星创作者 2022-05-16 21:29
    关注

    我帮你改一下吧,改好了

    img

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct Student
    {
        char name[20];
        char sex[10];
        int num;
        int clnum;
        struct Student* next;
    };
    struct Class
    {
        char clname[20];
        int id;
        struct Student* studenthead;//学生头指针
        struct Class* next;
    };
    void Menu();
    //下面的是与学生有关的函数
    struct Class* creatnode(struct Class* p);
    void Clinput(struct Class* head);
    void Initiate(struct Class* p);
    void Cldelete(struct Class* head);
    struct Class* cldelete1(struct Class* p);
    void Cldisplay(struct Class*head);
    //下面的是与班级有关的函数
    void Display(struct Class*head);
    struct Class* Add(struct Class*head);
    struct Class* Delete(struct Class*head);
     
     
    void Display(struct Class*head)
    {
        int count=0;
        int count1=0;
        struct Class *p;
        struct Student *o;
        for (p = head->next;p!=NULL;p=p->next)
        {
            count++;
        }
        //班级总数
        printf("班级总数为%d\n",count);
        if(head->next==NULL)
        {
            printf("还没添加班级呢!\n");
        }
        else
        {
            for(p=head->next;p->next!=NULL;p=p->next)
            {
                printf("该班名称%s\n",p->clname);
                for(o=head->studenthead->next;o->next!=NULL;o=o->next)
                {
                    count1++;
                }
                
                printf("该班已有同学数%d\n",count1);
            }
        }
        
    }
     
    struct Class* Add(struct Class* head)
    {
     
        struct Class *p,*q;
        if ((q=(struct Class *)malloc(sizeof(struct Class)))==NULL) exit(1);
        printf("请输入班级名称\n");
        scanf("%s",&q->clname);
        printf("请输入班号\n");
        scanf("%d",&q->id);
        for (p = head;p->next!=NULL;p=p->next);//第一个指针无数据域、尾接法、确保每次数据可以接到链表末端
        p->next=q;
        q->next=NULL;
        q->studenthead=NULL;//方便后面判断是否为第一个录入学生
        printf("信息已添加完成!\n");
        return head;
     
     
    }
     
    struct Class* Delete(struct Class*head)
    {
        struct Class *p;
        struct Class *q;
        int number;
        printf("请输入要删除班级的班号\n");
        scanf("%d",&number);
        p=head;
        for(q=NULL;p;q=p,p=p->next)
        {
            if(p->id==number)
            {
                if(q)
                {
                    q->next=p->next;
                    free(p);
                    printf("删除成功\n");
                    break;
                    
                }
                else//由于我们的头指针不存放数据,这步可写可不写
                {
                    head=p->next;
                }
                free(p);
                printf("删除成功\n");
                break;
            }
        }
        return head;
     
     
    }
     
    void Clinput(struct Class* head)
    {
        int name;
        struct Class *p;
        printf("请先输入班号。\n");
        scanf("%d",&name);
        for (p=head;p->next!=NULL;p=p->next)
        {
            if(name==p->id)
            {
                p=creatnode(p);
                return ;
            }
        }
        printf("没有这个班号,请先到2.增加班级。\n");
    }
    struct Class* creatnode(struct Class* p)//下面的大写P为学生链表的位置指针,小写p为班级链表的节点指针
    {
        if(p->studenthead==NULL)
        {
            Initiate(p);
        }
        struct Student *P,*q;
        if ((q=(struct Student *)malloc(sizeof(struct Student)))==NULL) exit(1);
        printf("请输入学生名字\n");
        scanf("%s",&q->name);
        printf("请输入性别(male or female)\n");
        scanf("%s",&q->sex);
        printf("请输入学号\n");
        scanf("%d",&q->num);
        q->clnum=p->id;
        for (P = p->studenthead;P->next!=NULL;P=P->next);
        P->next=q;
        q->next=NULL;
        printf("学生信息已录入!\n");
        return p;
     
    }
    void Initiate(struct Class* p)
    {
        p->studenthead=(struct Student*)malloc(sizeof(struct Student));
        p->studenthead->next=NULL;
    }
    void Cldelete(struct Class* head)
    {
        int name;
        struct Class *p;
        printf("请先输入该同学所在班号\n");
        scanf("%d",&name);
        for (p = head;p->next!=NULL;p=p->next)
        {
            if(name==p->id)
            {
                p=cldelete1(p);
                return;
            }
        }
        printf("班号不存在!\n");
    }
    struct Class* cldelete1(struct Class* p)
    {
        int num;
        struct Student *P,*q;
        printf("输入要删除同学的学号\n");
        scanf("%d",&num);
        P=p->studenthead;
        for(q=NULL;P;q=P,P=P->next)
        {
            if(p->studenthead->num==num)
            {
                if(q)
                {
                    q->next=P->next;
                }
                else//由于我们的头指针不存放数据,这步可写可不写
                {
                    p->studenthead=P->next;
                }
                free(P);
                break;    
                
            }
        }
        return p;
    }
    void Cldisplay(struct Class*head)
    {
        int id;
        struct Class *p;
        struct Student *q;
        printf("请输入要显示的班级的班号\n");
        scanf("%d",&id);
        for(p = head;p->next!=NULL;p=p->next)
        {
            if(p->id==id)
            {
                if(head->studenthead->next==NULL)
                {
                    printf("该班级还未录入同学\n");
                }
                else
                {
                for(q=head->studenthead->next;q->next!=NULL;q=q->next)
                {
                    printf("姓名:%s 性别:%s 学号:%d\n",q->name,q->sex,q->num);
                }
                }
            }
            return;
        }
        printf("无此班级\n");
    }
     
     
     
     
     
    void Menu()
    {
        printf("\n");
        printf("\n");
        printf("\n");
        printf("**************欢迎使用同学录系统(注意所有的第一步都是建立班级先哦)**************");
        printf("\n");
        printf("\n");
        printf("***********  1.显示班级列表   ***********\n");
        printf("***********  2.增加班级    ***********\n");
        printf("***********  3.删除班级    ***********\n");
        printf("***********  4.班级同学录入    ***********\n");
        printf("***********  5.班级同学删除    ***********\n");
        printf("***********  6.显示指定班级同学录    ***********\n");
        printf("***********  7.退出    ***********\n");
    }
     
     
     
    main()
    {
        struct Class* Head=(struct Class*)malloc(sizeof(struct Class));
        Head->next=NULL;
        Head->studenthead=NULL;
        int choice;    
        char yes_no;
        do
        {
            Menu();
            printf("请输入指令0-7:\n");
            scanf("%d",&choice);
            switch(choice)
            {
            case 1:Display(Head);
                break;
            case 2:Head=Add(Head);
                break;
            case 3:Head=Delete(Head);
                break;
            case 4:Clinput(Head);
                break;
            case 5:Cldelete(Head);
                break;
            case 6:Cldisplay(Head);
                break;
            case 7:
                printf("感谢使用\n");
                exit(0);
                break;
            default:
                printf("输入错误,请重新输入。\n");
                break;
            }
            printf("是否继续 Y or N?\n");
            do
            {
                scanf("%c",&yes_no);
            }
            while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
        }
        while(yes_no=='Y'||yes_no=='y');
        
     
     
        return 0;    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月24日
  • 已采纳回答 5月16日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line