我需要帮助实现双向链表的上级指针逻辑部分。
基本上,我正在构建链接列表,目前链接列表是单链接的。我添加了必要的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;
}
答案 0 :(得分:0)
在您致电insertList
(createList
功能内)后,设置了前向链接,您只需要向后链接。
为此,在致电insertList
后,您需要检查h->next
是NULL
,如果不是,请将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;
}
我想这应该会把你带到下一个级别。