如何在双向链表中实现“prev”指针逻辑

时间:2011-11-18 18:39:34

标签: c list linked-list

我需要帮助实现双向链表的上级指针逻辑部分。

基本上,我正在构建链接列表,目前链接列表是单链接的。我添加了必要的struct node * prev;到我的Struct,这样我就可以在列表中的每个节点中同时拥有下一个指针和前一个指针。但现在我已经碰壁了,真的不知道如何在我的代码中实现* prev指针。

我没有寻找确切的解决方案,实际上只是朝着正确的方向发展。

typedef struct L { 
    char val;
    struct L *next;
    struct L *prev;
} List;

List *insertList(char val, List *t1 );
List *createList(void);

int main(void) {
    List *z = createList();
    while ( z != NULL ) {
        printf("%c", z->val);
        z = z->next;
    }
    return 0;
}

List *createList(void) {
    List *h = NULL;
    char c;
    do { 
        c =(char)getchar();
        h = insertList(c, h);
    }while(c != '.');
    return h;
}

List *insertList( char val, List *t1) {
    List *t = calloc(1, sizeof( List ));
    t->val = val;
    t->next = t1;
    return t;
}

3 个答案:

答案 0 :(得分:0)

在您致电insertListcreateList功能内)后,设置了前向链接,您只需要向后链接。

为此,在致电insertList后,您需要检查h->nextNULL,如果不是,请将h->next->prev设置为h。你也可以在insertList本身做同样的事情,检查t1是否NULL,如果不是,请将t1->prev设置为t

答案 1 :(得分:0)

insertList应为:

List *insertList( char val, List *t1) {
  List *t = calloc(1, sizeof( List ));
  t->val = val;
  t->next = t1;
  // Set the previous pointer
  if (t1 != NULL)
     t1->prev = t;  
  return t;
}

但是这个实现存在问题。假设您致电:

List* t1 = insertList('a', NULL)
List* t2 = insertList('b', t1)
List* t3 = insertList('c', t2)

现在你有了清单

c->b->a->NULL

如果你现在打电话

List *t4 = insertList('d', t1)

然后你的“清单”将是

c->b-
     \
   d->a->NULL

你在这里看到了问题。 这不是链接列表。如果您只是在列表的开头插入项目,那么您的实现就可以了。在另一种情况下,您应该重新考虑如何插入项目。

另外请不要忘记,您必须将 head 节点存储在某处。

您应该查看linked list Wikipedia Article和此linked lists in C/C++ tutorial

答案 2 :(得分:0)

您正在实现insert @ begin以保持复杂度O(1)。

对于双向链接列表,您需要向节点添加另一个指针“prev”,并确保指向列表中上一个节点的指针。 这必须在插入节点期间完成。因此,插入代码大致如下所示。

List *insertList( char val, List *t1) {
    List *t = calloc(1, sizeof( List ));
    t->val = val;
    t->next = t1;

    //For all nodes except the first insert, point the previous node
    if (t1 != NULL) {
       t1->prev = t;
    }
    return t;
}

我想这应该会把你带到下一个级别。