为什么我们在链表中以不同方式定义头节点和新节点

时间:2017-12-12 17:33:11

标签: c data-structures

$CsvContent = Import-Csv "C:\Users\Administrator\Documents\lab8\Lab8_db1.csv" | Select-Object -First 100
Foreach ( $Line in $CsvContent )
{
    $Line.FirstName | Add-Content -Path C:\Users\Administrator\Documents\lab8\FirstNames.txt
    $Line.LastName | Add-Content -Path C:\Users\Administrator\Documents\lab8\LastNames.txt
}

我只是想知道head_node是否也是一个new_node,并且两者都是相同的数据类型结构节点,那么为什么我们只是将它定义为

struct node
{
    int data;
    struct node *next;

}; 



  void addstart (struct node **n, int new_data){
        struct node *new = (struct node*)malloc(sizeof(struct node));
        new->data=new_data;
        new->next=*n;
        *n= new;
    }


int main(){
    struct node* head = NULL;
    addstart(&head,5); 
    return 0;
}

和其他节点:

struct node* head = NULL;

2 个答案:

答案 0 :(得分:0)

struct node* head = NULL;

因为head只是跟踪列表的head而没有别的。现在不要新节点做同样的事情吗?

是的,确实如此。它使用malloc跟踪您分配的内存,然后使用后续节点的next属性指出它。

headnewnode属于同一类型,两者的功能相同。但是我们对head赋予了不同的含义 - 我们将它指向列表的head而不是使它成为我们可以扔掉的局部变量。

那么为什么head = NULL

啊!那是因为我们总是创建一个节点并使其下一个属性指向当前head,然后我们改变头部以使新节点成为我们链接列表的一部分。

最初第一个节点应该是

+----+
|  +------+
+----+    |
          V
         NULL (Well to make this NULL we just make head = NULL initially)

我想知道为什么我们不在头部分配案例中使用malloc ..

因为它不需要 - 就这么简单。当head的目的是指向已分配的节点时,为什么要分配额外的内存空间然后将其分配给head。当我们添加另一个额外节点时,我们将其添加到链表的head并使其成为头。它只不过是指向列表的开头。就是这样。

new不是一个好的变量名。尝试一些好的。在命名变量之前先想一想,这将为您节省大量时间。

答案 1 :(得分:0)

因为当你声明头部时它没有任何指向的东西,它表示列表是空的,一旦添加数据它就可以指向列表中的第一个节点。