我想在C中創建一個列表,頭部和尾部不是指針,而是按值排列的節點。可以做到嗎?按C值創建列表中的尾部和頭部
我想使用頭部和尾部作爲一個空框架來放置列表之間。我知道如何將它創建爲指針,並且只想知道這一點,因爲我只是意識到我不知道如何單獨做這件事。
struct List{Node head, Node tail};
struct Node{struct Node* next, struct Node* prev, void* data};
我想在C中創建一個列表,頭部和尾部不是指針,而是按值排列的節點。可以做到嗎?按C值創建列表中的尾部和頭部
我想使用頭部和尾部作爲一個空框架來放置列表之間。我知道如何將它創建爲指針,並且只想知道這一點,因爲我只是意識到我不知道如何單獨做這件事。
struct List{Node head, Node tail};
struct Node{struct Node* next, struct Node* prev, void* data};
這是不可能有一個鏈表1非指針對象,它沒有任何意義可言,因爲列表的全部意義就是next
和previous
成員POINT到另一個相同類型的實例,因此他們必須是指針。
[1] 單或雙鏈表。
有一個節點指向列表的其餘部分,但不是作爲指向節點的指針,而是指向它將保存指針的節點。 List { 節點頭; //頭部和尾部不是節點的指針 節點尾部; } 節點{ Node * next; Node * prev; void * data; } –
@RonAham是的,該代碼將工作。您只需清除所有指向NULL的指針,然後設置'list.head.next =&list.tail'和'list.tail.prev =&list.head'來創建一個空列表。 – user3386109
如果將列表存儲在數組中,並且在結構的列表中記錄下一個或上一個元素的索引以代替指針,則可以創建鏈接列表的等效項。此外,您可以重新分配陣列而無需調整任何列表索引。因此:'struct Data {int next; int prev; void * data; };'和一個數組,比如'struct Data data [1024];'。給定'struct data * dp =&data [23];',列表中的下一個元素是data [dp-> next],前一個是data [dp-> prev]'。或者,如果你有'int idx =&data [23];',下一個元素是'data [data [idx] .next]'等等。 –
帶虛擬頭部和尾部列表的主要優點是你在列表函數中沒有特殊情況(插入,刪除等)。 頭部和尾部指針使您能夠處理每個功能中的特殊情況。
在語法上,您需要完全定義'struct Node'並在創建'struct List'之前創建'typedef struct Node Node'。要創建一個'List',編譯器必須知道'Node'的大小。 –
Ron你問的是創建一個**循環鏈表**,其中第一個節點(簡單地說就是第一個節點)和最後一個節點也僅僅是一個節點(指向第一個節點)。這確實是一個有效的選擇。你有兩種類型的列表。非圓形(正常的HEAD/TAIL列出HEAD/TAIL只是某些情況下的標記,或者不包含數據)。然後你有一個循環列表,其中所有節點是指向下一個指針(在單鏈表的情況下)的對等數據節點,或者在雙鏈表的情況下指向next/prev的指針。 –