2014-01-16 20 views
3

假設我有以下結構是否有可能只用指針結構(無數據類型)來實現堆棧?

typedef struct _Stack { 
    struct _Stack *next; 
} Stack; 

注意,在以上提供了一種用於存儲任何數據類型,僅*next指針結構。所以,我的問題是有可能以下功能是有效的。

void stackPush(Stack **stackP, void *dataP) { 
    Stack *data = (Stack*)dataP; 

    data->next = *stackP; 
    *stackP = data; 
} 

我的文件gtrashstack.c中看到glib庫中此功能。但是當我在上面編譯時,我收到了一條警告:In data->next : assignment from incompatible pointer type

我知道,我可以用通用指針重寫結構。但我只想知道,爲什麼上述不起作用?

更新:我的錯誤,在這裏我寫typedef struct _Stack但在我的程序中,我錯過了_Stack

+0

你的問題是基於一個錯誤的前提。這是有效的,它會起作用。雖然'data-> next = * stackP'應該寫成'data-> next =&(stackP-> next);'或'data-> next =(struct _Stack *)* stackP;'。 –

+0

爲什麼不''data-> next =(Stack *)* stackP' –

+0

因爲'data-> next'的類型是'struct _Stack *',而不是'Stack *'。 –

回答

2

此功能有效。可能將其用於不同的結構,如:

typedef struct my_Stack { 
    struct my_Stack *next; 
    sometype1 somename1; 
    ... 
    sometypen somenamen; 
} MyStack; 

即用於在指針到下一個ELEM被作爲該結構的第一場中的列表。這與在C++中通過簡單繼承構建類時的技巧是一樣的。對於這樣的結構,你可以打電話:

x = malloc(sizeof(struct my_Stack)); 
x->somename1 = aaa; ... 
stackPush(&mylist, x); 

我不確定這種風格的編程是否由C標準支持。對新手來說這不是一種好風格。對於知道他們在C中做什麼的開發人員而言。

+0

的'typedef struct'中添加'_Stack'。因此,它意味着我們也可以實現只有指向結構和無數據類型的鏈接列表。 –

+0

這是一回事。 – Marian

+0

最好說它只是一個把戲。數據** IS **緊挨着下一個指針。但是在'stackPush'的**上下文**中,**不需要關心數據的大小。所以它只是收到'* dataP'作爲** void指針**;將其解釋爲在該地址處具有「下一個」指針(不關心在下面的地址中可能還有數據);那麼只需執行'stackPush' – Billiska

1

答案是肯定的,可以僅使用指向結構(無數據類型)的指針來實現堆棧。在Linux中查看c中通用列表或隊列的實現(不知道它是否也在windows中實現)。看看它是如何實施的Linux Kernel Linked List Explained

+0

感謝您的回答,我真的想要這 –

+0

@ ashish2expert請注意list_entry宏,它返回指向實際數據結構的指針,給出內部歸檔列表的絕對內存地址(在您的情況下,這將是堆棧) – Dabo

相關問題