c - 指针如何与 C 中的双向链表一起工作?

标签 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

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

最佳答案

This seems okay to me so far, but I'm not sure how I will create a new node.

Scope 对象的 prevnext 成员必须指向其他 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 调用,具体取决于您用于分配对象的方法。

关于c - 指针如何与 C 中的双向链表一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36467310/

相关文章:

c - 我在这个程序中遇到运行时错误...为什么?

gcc 总是可以生成对寄存器的字访问吗?

c++ - 引用抽象类类型的结构

c++ - union 和 struct 的字节大小

c - 结构字符串数组打印最后输入的元素

c - 读取二进制文件问题

使用 make 在 linux 上编译驱动程序

c++ - 指向类的私有(private)数据成员的指针

c++ - 在不同命名空间中添加指向类的指针时出错?

c++ - C++中嵌套结构的 friend