原代碼主要錯誤
| 行號 | 錯誤類型 | 問題描述 | 修正 |
| 1-2 | 頭文件 | #include 缺少文件名 | #include <stdio.h> #include <stdlib.h> |
| 10 | 結構體 | struct *next 缺少標籤 | struct STD *next; 或前向聲明 typedef struct STD STD; |
| 28 | 拼寫 | scnaf → scanf | 修正拼寫 |
| 29 | scanf | scanf("%lf", p1->score) 缺少 & | scanf("%lf", &p1->score) |
| 31 | 邏輯 | head=NULL 放在循環外導致首節點丟失 | 移入 if(n==1) head=p1; 之前 |
| 33 | 邏輯 | 循環體缺少 p1 = p2 = malloc... 導致死循環 | 在循環末尾重新分配並讀取下一節點 |
| 45 | 變量 | printf("%d", d) 變量 d 未定義 | printf("%d", n) |
| 46 | 指針 | *P=head 大小寫錯誤且多 * | p = head; |
| 48 | 打印 | printf("%d", p->score) 用 %d 打印 double | %f 或 %.2f |
| 49 | 遍歷 | p->next; 無賦值,死循環 | p = p->next; |
修正後完整代碼
#include <stdio.h>
#include <stdlib.h>
typedef struct STD {
char name[20];
int num;
double score;
struct STD *next;
} STD;
STD* create_list();
void print_list(STD* head);
int main() {
STD* head = create_list();
print_list(head);
return 0;
}
STD* create_list() {
STD *head = NULL, *tail = NULL, *p;
int n = 0;
while (1) {
p = (STD*)malloc(sizeof(STD));
printf("輸入姓名(0結束): ");
scanf("%19s", p->name);
if (strcmp(p->name, "0") == 0) { free(p); break; }
printf("輸入學號: "); scanf("%d", &p->num);
printf("輸入成績: "); scanf("%lf", &p->score);
p->next = NULL;
if (head == NULL) head = tail = p;
else { tail->next = p; tail = p; }
n++;
}
printf("共輸入 %d 筆記錄\n", n);
return head;
}
void print_list(STD* head) {
STD* p = head;
while (p) {
printf("姓名: %-10s 學號: %-6d 成績: %.2f\n", p->name, p->num, p->score);
p = p->next;
}
}