指针如何与C中的双向链表一起使用?

时间:2016-04-07 05:20:26

标签: c pointers struct doubly-linked-list

如果我创建以下结构:

typedef struct node {
    int a;
    char b[100][15];
    struct node *prev;
    struct node *next;
} Scope;

我必须使用指针来初始化我的head_node吗?目前这是我的初始化函数:

Scope initScope() {
    Scope head;
    head.a = 1;
    head.prev = NULL;
    head.next = NULL;
    return head;
}

在某些功能中我会说

Scope head = initScope();

到目前为止,这对我来说似乎没问题,但我不确定如何创建新节点。我猜我需要一个Scope类型的指针。我必须使用大小范围malloc它,然后初始化它的值。创建头部时我应该这样做吗?我试图回答的基本问题是指针的目的是什么?如果在我的结构的定义中我写了

,该怎么办?
*Scope

而不是

Scope

?如果我需要使用指针来创建节点,那么为什么不使结构成为指针?根据我的理解指针,只允许我操作内存,那么当我创建一个节点并继续前进时会留下什么?

1 个答案:

答案 0 :(得分:0)

  

到目前为止,这对我来说似乎没问题,但我不确定如何创建新节点。

prev对象的nextScope成员必须指向其他Scope个对象才能创建链接列表。

这些对象可能位于静态分配的对象数组或动态分配的对象中。

  1. 从静态分配的数组创建链接列表

    Scope scopes[10];
    scopes[0].prev = NULL;
    scopes[9].next = NULL;
    for (int i = 0; i < 9; ++i )
    {
        scopes[i].next = &(scopes[i+1]);
        scopes[i+1].pref = &(scopes[i]);
    }
    
  2. 从动态分配的对象创建链接列表

    Scope* node = malloc(sizeof(*node));
    node->next = node->prev = NULL;
    for ( int i = 0; i < 9; ++i )
    {
       Scope* temp = malloc(sizeof(*temp));
       temp->prev = NULL;
       temp->next = node;
       node->prev = temp;
       node = temp;
    }
    

    您还可以使用一次调用动态分配所有对象。

    Scope* scopes = malloc(10*sizeof(*scopes));
    

    然后将其视为静态分配的数组。

    根据您使用哪种方法分配对象,您需要使用对free的正确调用。