为什么我会得到;分段错误“;尝试在带有标题的双链接列表中插入元素时?C语言
编辑1:忘了把一些东西翻译成英语。现在修好了。 编辑2:标题实例 我开始研究双链接列表,但在列表的开头或结尾插入项目时遇到了问题 重要提示:我正在使用标题来完成此操作。这样做很重要,因为通常的插入已经掌握 谢谢 要在开头插入的函数:为什么我会得到;分段错误“;尝试在带有标题的双链接列表中插入元素时?C语言,c,header,segmentation-fault,doubly-linked-list,C,Header,Segmentation Fault,Doubly Linked List,编辑1:忘了把一些东西翻译成英语。现在修好了。 编辑2:标题实例 我开始研究双链接列表,但在列表的开头或结尾插入项目时遇到了问题 重要提示:我正在使用标题来完成此操作。这样做很重要,因为通常的插入已经掌握 谢谢 要在开头插入的函数: void beginning_insert(ELEMENT *list, HEADER *l, int value) { ELEMENT * p = malloc(sizeof(ELEMENT)); p -> info = value;
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;
}
一旦这对你有意义,你应该能够轻松地推动一个新的元素
你的主菜应该非常简单,没有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("%d\n", l.info);
}
return (count_elem(list));
}
如果您可以运行此main并获得预期的输出,那么您对链表的理解应该很好;)
玩得开心
PS:您的seg故障可能来自您的else状况。您的指针可能走得太远了。问题已解决。
代码工作正常,调用时出现问题
HEADER * header = start_header();
以前,这种做法是错误的:
HEADER=start_HEADER()代码>在调试器中逐步执行…向我们展示如何初始化标头实例。您是否在标头中将head
和tail
初始化为NULL?((l->head)->prox)->ant)
这是什么?什么是prox
?@paddy就在那里,我编辑了问题.Thks作为提示。事实上,我自己已经很好地理解了双链接列表。但是下一步是使用header.while()循环不循环。