Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,指针如何处理双链表?_C_Pointers_Struct_Doubly Linked List - Fatal编程技术网

在C语言中,指针如何处理双链表?

在C语言中,指针如何处理双链表?,c,pointers,struct,doubly-linked-list,C,Pointers,Struct,Doubly Linked List,如果我创建以下结构: typedef struct node { int a; char b[100][15]; struct node *prev; struct node *next; } Scope; 我必须使用指针来初始化头部节点吗?目前这是我的初始化函数: Scope initScope() { Scope head; head.a = 1; head.prev = NULL; head.next = NULL;

如果我创建以下结构:

typedef struct node {
    int a;
    char b[100][15];
    struct node *prev;
    struct node *next;
} Scope;
我必须使用指针来初始化头部节点吗?目前这是我的初始化函数:

Scope initScope() {
    Scope head;
    head.a = 1;
    head.prev = NULL;
    head.next = NULL;
    return head;
}
在某种功能上,我会说

Scope head = initScope();
到目前为止,这似乎还可以,但我不确定如何创建新节点。我猜我需要一个Scope类型的指针。我必须malloc它的大小范围,然后初始化它的值。我应该在创建头部时执行相同的操作吗?我试图回答的基本问题是,指针的用途是什么?如果在我写的结构的定义中

*Scope
而不是

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

到目前为止,这似乎还可以,但我不确定如何创建新节点

Scope
对象的
prev
next
成员必须指向其他
Scope
对象以创建链接列表

这些对象可以是静态分配的对象数组,也可以是动态分配的对象数组

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

    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]);
    }
    
    然后将其类似于静态分配的数组

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


  • 那么我将使用指针来创建节点?第一个节点将有空指针,之后的每个节点都将链接到下一个指针?所以我只是用struct来分配一定大小的内存块?指针指向对象。我不知道你的意思,所以我会使用指针来创建节点?如果只有一个节点,则它是
    next
    prev
    成员将为空。否则,他们不会。是的,您正在使用一个
    struct
    来分配一个特定大小的内存块。我的意思是,与其说
    int=5
    ,不如说
    int*ptr=malloc(sizeof(int))&ptr=5所以本质上我是在分割int大小的内存。现在把这个想法应用到链表中,我必须这样做,否则每个节点都会有一个唯一的变量名,对吗?或者我有一个节点数组,每个节点都有一个唯一的索引?我想我开始明白为什么我需要在头部之后的节点上使用指针了。@Pareod,你的方向是对的。唯一不正确的是您需要使用
    *ptr=5,而不是
    &ptr=5&ptr=5将数字5放入该内存块?说
    ptr=5
    会改变指针正在查看的内存块。例如,
    currentNode=currentNode->prev不会将当前内存设置为prev,它会更改currentNode查看的位置。
    
    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));