#include<stdio.h> #include<stdlib.h> struct l{ int a; struct l *next; }; struct l *creat() { struct l *head,*p1,*p2; int n,i; scanf("%d",&n); head=NULL; p1=(struct l *)malloc(sizeof(struct l)); scanf("%d",&p1->a); p1->next=NULL; head=p1; p2=p1; for(i=0;i<n-1;i++) { p1=(struct l *)malloc(sizeof(struct l)); scanf("%d",&p1->a);p1->next=NULL; p2->next=p1; p2=p1; } return head; } void printl(struct l *head) { struct l *p; p=head; while(p!=NULL); { printf("%d ",p->a); p=p->next; } } int main() { struct l *head; head=creat(); printl(head); return 0; },这个代码问题在哪
时间: 2023-11-22 16:52:23 浏览: 63
这段代码有两个问题:
1. 在 `printl` 函数中,while 循环的条件中多了一个分号,导致循环体中的语句无法执行,造成无法输出链表中的元素。
2. 在 `main` 函数中,调用 `creat` 函数后没有判断返回的链表头指针是否为 NULL,如果内存分配失败,会返回 NULL,此时调用 `printl` 函数会出现错误。
修改后的代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
struct l{
int a;
struct l *next;
};
struct l *creat() {
struct l *head,*p1,*p2;
int n,i;
scanf("%d",&n);
head=NULL;
for(i=0;i<n;i++)
{
p1=(struct l *)malloc(sizeof(struct l));
if(p1 == NULL) {
printf("Memory allocation failed.\n");
exit(1);
}
scanf("%d",&p1->a);
p1->next=NULL;
if(head==NULL) {
head=p1;
p2=p1;
} else {
p2->next=p1;
p2=p1;
}
}
return head;
}
void printl(struct l *head) {
struct l *p;
p=head;
while(p!=NULL) // 去掉多余的分号
{
printf("%d ",p->a);
p=p->next;
}
}
int main() {
struct l *head;
head=creat();
if(head == NULL) {
exit(1);
}
printl(head);
return 0;
}
```
阅读全文