c语言,修改链表内容,循环意外停止



#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
struct patients
{
    char name[20];
    char id_number[20];
    char disease[20];
    char bed_number[5];
    int q;
    struct patients* pnext;
};
struct patients* create(int *n)
{
    struct patients *pnew,*pend,*phead;
    char space[10]={"********"};
    char a[4];
    phead=pnew=pend=(struct patients*)malloc(sizeof(struct patients));
    if(*n==0)
    {
        phead->pnext=NULL;
    }
    printf("请输入患者的姓名:");
    scanf("%s",&pnew->name);
    printf("请输入患者的证件号:");
    scanf("%s",&pnew->id_number);
    printf("请输入患者所属的科室:");
    scanf("%s",&pnew->disease);
    printf("请输入患者的病床号:");
    scanf("%s",&pnew->bed_number);
    printf("输入99结束注册");
    scanf("%d",&pnew->q);
    *n++;
    
    
    for(;;)
    {
        if(pend->q==99)
        {
            break;
        }
        pnew=(struct patients*)malloc(sizeof(struct patients));
        printf("请输入患者的姓名:");
        scanf("%s",&pnew->name);
        printf("请输入患者的证件号:");
        scanf("%s",&pnew->id_number);
        printf("请输入患者所属的科室:");
        scanf("%s",&pnew->disease);
        printf("请输入患者的病床号:");
        scanf("%s",&pnew->bed_number);
        printf("输入99结束注册");
        scanf("%d",&pnew->q);
        *n++;
        pend->pnext=pnew;
        pend=pnew;
        if(*n==19)
        {
            printf("床位已满,自动退出循环\n");
            return phead;
            
        }
    }
    return phead;
}
struct patients* re(int *n)
{
    struct patients *phead;
    phead=create(n);
    return phead;

}
void see_patients(struct patients *phead)
{
    struct patients *pend;
    pend=phead;
    for(;;)
    {
        printf("%s******",pend->name);
        printf("%s******",pend->id_number);
        printf("%s******",pend->disease);
        printf("%s******",pend->bed_number);
        printf("\n");
        pend=pend->pnext;
        if(pend==NULL)
        {
            break;
        }
    }
    
}
struct patients *change_patients(int b,struct patients *phead)
{
    int i=0;
    struct patients *pend,*pnew,*p,*q;
    pend=phead;
    
    
    for(i;i<b-1;i++)
    {
        q=pend;//one
        pend=pend->pnext;//two
        p=pend->pnext;//three
    }
    
    pnew=(struct patients*)malloc(sizeof(struct patients));
    printf("请输入患者的姓名:");
    scanf("%s",&pnew->name);
    printf("请输入患者的证件号:");
    scanf("%s",&pnew->id_number);
    printf("请输入患者所属的科室:");
    scanf("%s",&pnew->disease);
    printf("请输入患者的病床号:");
    scanf("%s",&pnew->bed_number);
    pnew->pnext=p;
    q->pnext=pnew;
    
    
    
    return phead;
    
}

void main()
{
    int l;
    int icount=0;
    struct patients *phead;
    
    menu:
    phead=re(&icount);
    printf("请输入修改链表的序号:");
    scanf("%d",&l);
    change_patients(l,phead);
    see_patients(phead);
    goto menu;
}

这个程序的goto指令只会执行一次,我不太清楚为什么

你怎么到处写scanf呢
create里不是应该建立一个病人的信息吗,为什么在里面死循环一直录入病人
这逻辑乱糟糟的
你先把逻辑分开,一个函数管一件事,别都混在一起