#include<stdio.h> #include<string.h> #include<stdlib.h> #define LEN sizeof(struct nodelink) struct nodelink { long num; char name[20]; struct nodelink *next; }; struct nodelink *create() { struct nodelink *p,*q,*head=NULL; p=q=(struct nodelink*)malloc(LEN); for(int i=0;i<10;i++) { scanf("%ld",&p->num); scanf("%c",p->name); if(i==0) head=p; else p->next=q; p=q; q=(struct nodelink*)malloc(LEN); } p->next=NULL; free(q); return head; } int main() { struct nodelink *head; head=create(); return 0; }
时间: 2023-12-07 14:04:57 浏览: 160
这段代码存在一些问题:
1. 在输入姓名时,应该使用 `scanf("%s", p->name)`,而不是 `scanf("%c", p->name)`。因为 `%c` 只能读取一个字符,而 `%s` 可以读取一个字符串。
2. 在创建链表时,应该先将新节点的指针域设为 NULL,再将上一个节点的指针域指向新节点。因为如果先将上一个节点的指针域指向新节点,再将新节点的指针域设为上一个节点,那么新节点的指针域就会丢失,链表就会断开。
3. 在输入姓名时,应该忽略掉姓名后面的空格和回车符。可以在读取数字后加上一个 `getchar()`。
下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(struct nodelink)
struct nodelink {
long num;
char name[20];
struct nodelink *next;
};
struct nodelink *create() {
struct nodelink *p, *q, *head = NULL;
p = q = (struct nodelink*)malloc(LEN);
for(int i = 0; i < 10; i++) {
scanf("%ld", &p->num);
getchar(); // 忽略掉数字后面的回车符
scanf("%s", p->name);
if(i == 0) {
head = p;
} else {
q->next = p;
}
q = p;
p = (struct nodelink*)malloc(LEN);
}
p->next = NULL;
free(p);
return head;
}
int main() {
struct nodelink *head;
head = create();
return 0;
}
```
阅读全文