为什么我在使用 header 尝试在双向链表中插入元素时得到 "Segmentation faults"? C语言
Why am I getting "Segmentation faults" when trying to insert elements in doubly linked list with header? C language
编辑 1:忘记将一些内容翻译成英文。现在修好了。
编辑 2:HEADER 实例。
我开始研究双向链表,但我一直无法在列表的开头或结尾插入项目。
重要提示:我正在使用 header 来做到这一点。用这个做很重要,因为平时的insert已经掌握了
谢谢!
要在开头插入的函数:
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;
}
为了更好地理解双向链表,我建议您避免使用 header。
相反,你应该使用这样的东西
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;
}
只要您理解了这一点,您就应该能够轻松推送新元素。
并且您的 main 应该保持非常简单,其中没有 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: 你的段错误可能来自你的 else 条件。您的指点可能太过分了。
问题已解决。
代码工作正常,调用时出现问题
HEADER * header = start_header();
以前,这是错误的方式:
HEADER header = start_header();
编辑 1:忘记将一些内容翻译成英文。现在修好了。 编辑 2:HEADER 实例。
我开始研究双向链表,但我一直无法在列表的开头或结尾插入项目。
重要提示:我正在使用 header 来做到这一点。用这个做很重要,因为平时的insert已经掌握了
谢谢!
要在开头插入的函数:
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;
}
为了更好地理解双向链表,我建议您避免使用 header。
相反,你应该使用这样的东西
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;
}
只要您理解了这一点,您就应该能够轻松推送新元素。
并且您的 main 应该保持非常简单,其中没有 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: 你的段错误可能来自你的 else 条件。您的指点可能太过分了。
问题已解决。 代码工作正常,调用时出现问题
HEADER * header = start_header();
以前,这是错误的方式:
HEADER header = start_header();