鸣神组CP头子 2022-05-18 18:29 采纳率: 100%
浏览 79
已结题

大一同学录简单编程 帮

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#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!=NULL;p=p->next)
        {
            printf("该班名称%s\n",p->clname);
            if(p->studenthead->next!=NULL)
            {
                for(o=p->studenthead->next,count1=0;o!=NULL;o=o->next)//?
                {
                    count1++;
                }
            }
            else
            {
                count1=0;
            }
            
            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;
        }
    }
    printf("班号不存在!\n");
    return head;
 
 
}
 
void Clinput(struct Class* head)
{
    int name;
    struct Class *p;
    printf("请先输入班号。\n");
    scanf("%d",&name);
    for (p=head->next;p!=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!=NULL;p=p->next)
    {
        if(name==p->id)
        {
            p=cldelete1(p);
            printf("删除成功!");
            return;
        }
    }
    printf("班号不存在!\n");
}
struct Class* cldelete1(struct Class* p)
{
    int num;
    struct Student *P,*q;
    printf("输入要删除同学的学号\n");
    scanf("%d",&num);
    for(P=p->studenthead,q=NULL;P!=NULL;q=P,P=P->next)
    {
        if(P->num==num)
        {
            if(q)
            {
                q->next=P->next;
            }
            else//由于我们的头指针不存放数据,这步可写可不写
            {
                p->studenthead=P->next;
            }
            free(P);
            break;    
            
        }
    }
    return p;
}
void Cldisplay(struct Class*head)
{
    int hao;
    struct Class *p;
    struct Student *q;
    printf("请输入要显示的班级的班号\n");
    scanf("%d",&hao);
    for(p = head;p!=NULL;p=p->next)
    {
        if(p->id==hao)
        {
            if(p->studenthead==NULL)
            {
                printf("该班级还未录入同学!\n");
                return ;
            }
            else
            {
                for(q=p->studenthead->next;q!=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()
{
    system("color 02");
    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;    
}
 

运行结果及报错内容

void Display(struct Class*head)这一块当学生人数为0时为什么进程会直接终止啊?

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

void Display(struct Class*head)学生人数为0时,输出该班已有同学数为0.

  • 写回答

3条回答 默认 最新

  • zpeien Android领域新星创作者 2022-05-18 20:20
    关注

    在Display 方法中,head 节点没有判断是不是有下一个节点,直接赋值给 指针p,所以当学生人数为 0 时,head 是没有下一个节点的,就会出现程序终止。你先判断一下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!=NULL;p=p->next)
            {
                printf("该班名称%s\n",p->clname);
                if(p->studenthead->next!=NULL)
                {
                    for(o=p->studenthead->next,count1=0;o!=NULL;o=o->next)//?
                    {
                        count1++;
                    }
                }
                else
                {
                    count1=0;
                }
                
                printf("该班已有同学数%d\n",count1);
            }
        }
        
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分