錯誤代碼片段
struct LinkList { int data; struct LinkList *next; };
struct LinkList Reverse(LinkList *list) { ... } // 錯誤:返回類型寫成 struct LinkList (值) 而非指針
// 調用處
struct LinkList Reverse(LinkList *L); // 聲明同樣錯誤
q = L->next; // L 是結構體變量而非指針,無 -> 運算符
編譯器報錯解讀
Main.c:31: error: expected ')' before '*' token
// 指向 struct LinkList Reverse ( LinkList *list ) * 出錯 **
// 編譯器將 struct LinkList Reverse 解析為聲明,遇到 *list 視為語法錯誤
核心類型混淆
| 概念 | 正確聲明 | 訪問成員 |
| 結構體類型 | struct LinkList | . |
| 結構體指針 | struct LinkList * | -> |
| 函數返回指針 | struct LinkList *Reverse(...) | - |
修正版代碼
#include <stdio.h>
#include <stdlib.h>
typedef struct LinkList { // 使用 typedef 簡化
int data;
struct LinkList *next;
} Node;
Node* Reverse(Node *list) { // 返回指針
if (!list) return NULL;
Node *prev = NULL, *curr = list, *next = NULL;
while (curr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev; // 新頭節點
}
int main() {
Node *head = NULL, *tail = NULL;
int val;
while (scanf("%d", &val) == 1 && val != -1) {
Node *n = malloc(sizeof(Node));
n->data = val; n->next = NULL;
if (!head) head = tail = n;
else { tail->next = n; tail = n; }
}
head = Reverse(head);
for (Node *p = head; p; p = p->next) printf("%d ", p->data);
// 釋放內存略
return 0;
}
關鍵修正點
- 函數返回類型改為 `Node*` (指針)。
2. 參數類型統一為 `Node*`。
3. 主函數中 `head`/`tail`/`p` 均聲明為指針,使用 `->` 訪問。
4. 輸入循環邏輯修正:`while (scanf("%d", &val)==1 && val!=-1)`。