[英]Linked List implementation using C
我無法理解某些東西:
typedef struct {
int info;
struct node* next;
} node;
int main() {
node* head = NULL; /*here*/
node* second = NULL;
node* third = NULL;
那條線node* head = NULL;
做? 它是否初始化了一個名為 head 的新node
? 那為什么*
在那里,我的結構是typedef
d 只是node
所以在其他情況下處理數據結構時,在這種情況下我應該使用類似node head = NULL
。
在這段代碼的后面,我有
head = (struct node*)malloc(sizeof(node));
我猜,它為該節點分配空間。 而這部分
head->info = 1;
head->next = second;
設置頭節點的數據和指針部分。 我理解正確嗎?
那行“節點*頭= NULL;”是什么?
因此,node* 是一種您使用typedef 結構代碼創建的數據類型。 所以當你做 node* head 時,你實際上是在定義一個指向 node datatype的指針。 由於最初沒有實現鏈表,因此頭部不會指向任何地方,它指向NULL 。
請注意: head 不是新節點,它是指向數據類型的指針 - 節點
head = (struct node*)malloc(sizeof(node))
在這里,您是對的 - 我們正在為節點類型分配 memory,但我們返回 memory 空間的地址並將其存儲在head中。
頭->信息= 1;
頭->下一個=第二個;
head -> info 用於存儲數據值,而 head -> next, next 是指向我們的鏈表實現中的下一個節點(如果有)的指針。 next 和 head具有相同的數據類型“node*”
它會初始化一個名為 head 的新“節點”嗎?
不,它初始化一個指向某個地方的指針,並指示編譯器這個地方必須被解釋為一個“節點”結構。 因此,例如,“head->info”將意味着前兩個或四個或八個字節,取決於您機器上的 integer 大小,將被解釋為 integer 值。
實際上,指針隨后被初始化為 NULL,所以它根本不指向任何地方。
構建列表時,您將創建新節點,然后head將更新為指向這些節點中的第一個。 頭部為 NULL 意味着列表為空。
也許這似乎很困難的一個原因是
typedef struct {
int info;
struct node* next;
}node;
是 Node 的定義,而不是鏈表的定義。 更多關於下面的內容。
但是node* head = NULL;
將head
聲明為指向node
的指針,該結構表示列表的單個節點。 在node
內部, info
是數據部分,可以是任何東西,比如指向一個巨大的有用數據結構的指針。 在這種情況下,只是一個數字。 next
是鏈接部分,將指向列表中的下一個節點。
在您的程序中,作為指向node
的指針, head
可以指向這樣的結構,具有數據部分、 info
字段和指向另一個節點的指針,即next
字段。 有時還有一個指向前一個節點的指針,出於顯而易見的原因,它被稱為雙鏈表。
但這本身並不是一個鏈表。 只是一個指向節點的指針,由於它已初始化為 NULL,因此它現在沒有指向任何內容。
你可以寫
node my_node;
現在我們有了一個節點。 my_node
有兩個字段,你可以寫
my_node.info = 1;
my_node.next = NULL;
並說你有一個只有一個節點的鏈表。 您甚至可以通過使用運算符“地址”(即與號)來head
它,方法是:
head = &my_node;
它獲取my_node
的地址並將其放入指向node
的指針中。 這就是指針的意義所在。
或者你可以寫
head = (node*) malloc( sizeof(node) );
並分配 memory 只是一個節點的大小。 然后head
不再是指向NULL
的指針。 它是指向一個節點大小的區域的指針,可以這樣使用。 你現在可以寫
head->info = -3456;
head->next = NULL;
請注意,在指針的情況下,您使用運算符->
來訪問該字段,而不是上面my_node
示例中的dot
,這是您程序中的局部變量。
如果清楚什么是head
以及程序中聲明的含義,您現在可以停止閱讀。 下面只是一個更完整的例子
struct c_node
{
void* data;
struct c_node* next;
struct c_node* prev;
};
typedef struct c_node CNode;
struct c_list
{
char* name;
int capacity;
int size;
CNode* start;
CNode* end;
};
typedef struct c_list _List;
請注意,在上面的_List
示例中,事情可以得到更多的意義。 一個人可以寫
_List my_linked_list;
但是這里的my_linked_list
有節點、保持列表實際大小的參數、可能的容量限制、指向列表開頭和結尾的指針,以使生活更簡單。 甚至是一個名字。
創建列表時,您設置的內容如下
_List* create_list(const char* name, int capacity)
{
_List* list = (_List*) malloc( sizeof(_List) );
list->capacity = capacity;
list->size = 0;
list->start = list->end = NULL;
list->name = (char*)malloc(strlen(name) + 1);
strcpy(list->name, name);
return list;
}
並通過調用創建一個列表
_List* = create_list("My First 100 Nodes", 100);
請注意,在這種情況下,數據只是一個指針,即void* data;
節點結構的一部分, CNode
,所以這個東西可以指向任何東西,創建一個抽象的數據結構,一個東西的容器。
這只是一個例子的一部分,目的只是為了更清楚地展示(我相信)鏈表的目的和結構。 不僅僅是一個節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.