C问题《〈〈〈
#include<stdio.h>
include<malloc.h>
struct list{int b;
struct list *nt;};
struct list *sqlb()/*链表申请*/
{struct list *p,*h;
int a;n=1;
printf("请输入\n");
while(scanf("%d",&a);
{p=(struct list*)malloc(sizeof(struct list));
p->b=a;
if(n==1) h=p;
else p->nt=p;
n++;}
p->nt=NULL;
return h;}
void sclb(struct list *p)/输出链表*/
{while(p->nt!=NULL){
printf("%d",p->b);
p=p->nt;}}
main()
{struct list *k;
k=sqlb();
sclb(k);}
为什么不能正常运行??
参考答案:#include<stdio.h>
#include<stdlib.h>
struct list {
int b;
struct list *nt;
};
struct list *
sqlb(void)
{
struct list * h, * p, * q;
int flag, n = 0; /* 声明出错int a; n = 1;,a后面的分号导致n无类型,其实a没用,可以直接把值读进&p->b */
p = (struct list *) malloc(sizeof(struct list));
printf( "Please input: " );
flag = scanf( "%d", &p->b ); /* 你的链表必须要有一个先导元素打头 */
while(flag == 1) { /* 多了;,导致while循环无效 */
n++; /* flag == 1说明scanf成功读入一个整数,计数器加1 */
q = p; /* 记住当前节点,下面要分配新的节点,必须用一个指针跟踪前一个节点,以备后面scanf不成功时前一个节点的nt置为NULL */
p = (struct list *) malloc(sizeof(struct list));
if(n == 1)
h = q;
q->nt = p; /* 这里不能用else,否则你的链表脱节 */
printf( "Please input: " );
flag = scanf( "%d", &p->b ); /* 直接读进&p->b,不需要再用a做中转 */
}
q->nt = NULL; /* 循环退出,说明scanf读取失败,那么新分配的这个节点p没用,应该把它前一个节点q的nt置NULL */
free(p); /* 并且释放掉这个没用的空间 */
return h; /* 返回表头*/
}
void
sclb(struct list * p)
{
while ( p != NULL ) { /* 这里应该检测p,而不是p->nt,因为你马上就用到p->b,否则如果p本身就是NULL,你的p->nt就非法 */
printf( "%d ", p->b );
p = p->nt;
}
}
int
main(void)
{
struct list * k;
k = sqlb();
sclb(k);
return 0;
}