首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

GCC 編譯 C 語言鏈表反轉報錯:結構體指針類型與函數聲明不匹配

     編輯:程式設計綜合問答

錯誤代碼片段


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;
}

關鍵修正點

  1. 函數返回類型改為 `Node*` (指針)。
  2. 2. 參數類型統一為 `Node*`。 3. 主函數中 `head`/`tail`/`p` 均聲明為指針,使用 `->` 訪問。 4. 輸入循環邏輯修正:`while (scanf("%d", &val)==1 && val!=-1)`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved