编辑1:忘记将一些东西翻译成英文。现已修复。编辑 2:标头实例。
我正在开始研究双向链表,并且在列表的开头或结尾插入项目时遇到了问题。
重要提示:我正在使用标题来执行此操作。这样做很重要,因为通常的插入已经掌握了。
谢谢!
开头插入的函数:
void beginning_insert(ELEMENT *list, HEADER *l, int value)
{
ELEMENT * p = malloc(sizeof(ELEMENT));
p -> info = value;
p -> next = l -> head;
p -> previous = NULL;
l -> head = p;
if(l -> tail == NULL)
{
l -> tail = l -> head;
}
else
{
(((l -> head) -> next) -> previous) = p;
}
l -> number_of_nodes++;
list = p;
}
在末尾插入的功能:
ELEMENT * end_insert(HEADER *l, int value)
{
ELEMENT * new = malloc(sizeof(ELEMENT));
new -> info = valor;
new -> next = NULL;
new -> previous = l -> tail;
if(l-> head == NULL)
{
l -> head = new;
}
else
{
l -> tail -> next = new;
}
l -> tail = new;
l -> number_of_nodes++;
return new;
}
使用的结构:
typedef struct element
{
int info;
struct element * next;//control
struct element * previous;//control
} ELEMENT;
typedef struct header //control
{
ELEMENT * head;
int number_of_nodes;
ELEMENT * tail;
} HEADER;
//Header instance
HEADER * start_header()
{
HEADER *l;
l = malloc(sizeof(HEADER));
l -> number_of_nodes = 0;
l -> head = NULL;
l -> tail = NULL;
return l;
}
为了更好地理解双向链表,我建议您避免使用标题。
相反,你应该使用这样的东西
ELEMENT* go_start(ELEMENT* l)
{
while (l->prev)
l = l->prev;
return l;
}
ELEMENT* go_end(ELEMENT* l)
{
while (l->next)
l = l->next;
return l;
}
一旦这对您有意义,您应该能够轻松推送新的 elem。
你的主菜应该保持非常简单,里面没有malloc:
int main()
{
ELEMENT* list;
list = push_top(list, 18);
list = push_bottom(list, 18);
list = push_top(list, 18);
list = go_start(list);
while (l->next)
{
printf("%dn", l.info);
}
return (count_elem(list));
}
如果你可以运行这个 main 并获得预期的输出,你对链表的理解应该是很好的;)
玩得愉快
PS:您的赛格故障可能来自您的其他条件。你可能在指针上走得太远了。
问题解决了。代码工作正常,调用时出现问题
HEADER * header = start_header();
以前,它以错误的方式完成: HEADER header = start_header();