为什么这个程序输入一次结束了,有关C语言的

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 struct stu
{
     char bd;
    char *name;
    struct stu *next;
};
struct stu *cread()
{
    int i=0;
struct stu *head,*p,*q;
    q=p=head=(struct stu *)malloc(sizeof(struct stu));
    if(!head)
    {
        printf("创建失败\n");
        exit(1);    
    }
    head->next=NULL;
    q=head;
    printf("请输入\n");
    scanf("%c%s",&q->bd,q->name);
        printf("%s ",q->name);
    while(q->bd!='\n')
    {
        i++;
        printf("%d ",i);
        p->next=q;
        p=q;
        printf("第%d次输入\n");
        scanf("%c%s",&q->bd,q->name);
    }
    p->next=NULL;
    return head;
}
void print(struct stu *h)
{
    struct stu *head;
    head=h;
    while(head->next!=NULL)
        printf("%s ",head->name);
}
int main()
{
         struct stu *a=cread();
        print(a);
     return 0;
 

}

scanf("%c%s",&q->bd,q->name);//这里输入的时候会有一个回车符
printf("%s ",q->name);
while(q->bd!='\n')//没有处理上次输入的回车符,所以这里就直接结束了,循环不执行。
修改方法:在while(q->bd!='\n')上面加一句:getchar();

因为你第一次输入后回车了,这个回车还在输入缓存里,自动被第二次输入接收导致结束循环
而且你循环内部也需要申请新的q空间,不能顶着一个用啊

struct stu *cread()
{
    int i=0;
    struct stu *head,*p,*q;
    q=p=head=(struct stu *)malloc(sizeof(struct stu));
    if(!head)
    {
        printf("创建失败\n");
        exit(1);    
    }
    head->next=NULL;
    q=head;
    printf("请输入\n");
    scanf("%c%s",&q->bd,q->name);
    printf("%s ",q->name);
    while(q->bd!='\n')
    {
        i++;
        printf("%d ",i);
        printf("第%d次输入\n");
        getchar();//消化掉回车符
        q = (struct stu *)malloc(sizeof(struct stu));//开辟新的节点空间
        scanf("%c%s",&q->bd,q->name);
        p->next=q;   //放到这里才合适
        p=q;
    }
    p->next=NULL;
    return head;
}

cread的循环中没有分配内存


p=q;
while(q->bd!='\n')
{
    i++;
    printf("%d ",i);
    
    q=(struct stu *)malloc(sizeof(struct stu));
    q->next=NULL;
    
    p->next=q;
    p=q;
    printf("第%d次输入\n");
    scanf("%c%s",&q->bd,q->name);

}