簡體   English   中英

使用 C 實現鏈表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM