#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);
}