2017-04-14 140 views
1

我創建一個使用基本堆疊在C.在該程序我在標題中定義的兩種結構:C數據結構錯誤

  1. 的結構命名節點與一個字符串和一個指針到以前的節點作爲成員。
  2. 一個名爲Stack的結構,其中有一個指向最後一個節點的指針作爲成員。

    下面是這些結構的定義,在我的頭文件:

    #include <stdio.h> 
    #include <stdlib.h> 
    typedef struct Node { 
    const char* string; 
    struct Node *prev; 
    }; 
    
    typedef struct Stack { 
    size_t sizeOfStack; 
    size_t sizeOfElem; 
    struct Node *last; 
    }; 
    

一種方法給我的錯誤是創建堆棧():

創建堆棧:該函數創建一個堆(相當於一個構造函數)。

(A)名稱:創建堆棧

(B)返回類型:一個指針,指向在堆上分配一個堆棧。

這是我實現

Stack* CreateStack() { 
     Stack* stack = malloc(sizeof(*stack)); 
     if (stack == NULL) { 
      return NULL; 
     }//end of if 
     stack->sizeOfElem = 0; 
     stack->sizeOfStack = 0; 
     stack->last = NULL; 
     return stack; 
    }//end of CreateStack 

但是編譯器吐出了這一點:

錯誤:「堆棧{又名結構棧}」沒有名爲成員「最後」 重新建立了新>末頁=節點;

錯誤:'Stack {aka struct Stack}'沒有名爲'last'的成員 node-> prev = stack-> last;

錯誤:'Stack {aka struct Stack}'沒有名爲'last'的成員 Node * node = stack-> last;

如果有人能指出這個問題,我將不勝感激。我很困惑,爲什麼它說最後一件事不是一件事,但在另一件結構中以相同的方式定義的前提並沒有引起注意。謝謝。

+0

你的編譯器錯誤不是你展示的代碼。你的typedefs不完整。 – aschepler

+0

「尋求調試幫助的問題(」爲什麼這個代碼不工作?「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。對其他讀者很有用,參見:[**如何創建一個最小,完整和可驗證的示例**](http://stackoverflow.com/help/mcve)。「 –

+0

@aschepler是的,它是冗長的代碼,所以,因爲這個錯誤似乎並不是特定於使用這些結構的方法,所以我認爲錯誤在結構中。我自己提供了結構。所有的錯誤都將「last」引用爲不存在。 –

回答

1

您的typedef語句不完整,因爲您沒有爲類型定義名稱。寫下如下。

typedef struct Stack { 
    size_t sizeOfStack; 
    size_t sizeOfElem; 
    struct Node *last; 
}Stack; 

注意Stack在端部,其限定現在鍵入Stack等效於struct Stack

+1

'Stack * stack = malloc(sizeof(* stack))'確定。 – PSkocik

+0

@PSkocik:right;我在*堆棧中輸入了一個錯字,並假定OP是「* Stack」。 –

1

修復類型定義,它會編譯:

#include <stdio.h> 
#include <stdlib.h> 
typedef struct Node { 
const char* string; 
struct Node *prev; 
} Node ; 

typedef struct Stack { 
size_t sizeOfStack; 
size_t sizeOfElem; 
struct Node *last; 
} Stack; 

Stack* CreateStack() { 
    Stack* stack = malloc(sizeof(*stack)); 
    if (stack == NULL) { 
     return NULL; 
    }//end of if 
    stack->sizeOfElem = 0; 
    stack->sizeOfStack = 0; 
    stack->last = NULL; 
    return stack; 
}//end of CreateStack 
+0

爲什麼他的代碼不是語法錯誤? 'typedef'確實允許沒有名字?它有什麼作用? – Barmar

+0

@Barmar這是一種產生語法錯誤的機制。 :) – PSkocik