我在这段带有链表的代码中遇到了问题。它给了我错误:
Segmentation Fault (Core Dumped)
任何人都可以看到似乎是什么问题吗?提前谢谢。
pos
代表位置,root
代表第一个元素
typedef struct
{
element *root;
int size;
} list;
typedef struct _element
{
char *str;
struct _element *next;
} element;
int
insert_list (list * lst, const char *value, int pos)
{
element *new;
int k;
new = malloc (sizeof (element));
for (k = 0; k < pos; k++)
{
new = lst->root;
lst->root = lst->root->next;
if (k == pos - 1)
{
lst->root = NULL;
new->str = value;
}
}
for (k = 0; k <= lst->size; k++)
{
new = lst->root;
lst->root = lst->root->next;
if (k == lst->size)
{
lst->root = NULL;
new->str = value;
}
if (pos < 0 || pos >= lst->size)
return -1;
else
return pos;
}
}
答案 0 :(得分:1)
让我们看看如何调试它。
首先,使用警告编译代码,并阅读警告:
$ gcc -Wall x.c -o xx.c:6:3: error: unknown type name ‘element’
x.c: In function ‘insert_list’:
x.c:26:11: warning: assignment from incompatible pointer type [enabled by default]
x.c:27:28: error: request for member ‘next’ in something not a structure or union
x.c:32:20: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
x.c:38:11: warning: assignment from incompatible pointer type [enabled by default]
x.c:39:28: error: request for member ‘next’ in something not a structure or union
x.c:44:20: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
x.c:51:1: warning: control reaches end of non-void function [-Wreturn-type]
所有这些都是问题,2(错误)表示您发布的代码从未编译过
因此,除了分段错误之外,您还有问题。第一个是这一行:
lst->root = lst->root->next;
这是因为您需要在element
struct
之前定义list
struct
。
除此之外,您的插入例程已被破坏:
new = malloc (sizeof (element));
for (k = 0; k < pos; k++)
{
new = lst->root;
在这里,您将多次覆盖新分配的element
。
在下一行,您将覆盖root
:
lst->root = lst->root->next;
我担心我甚至无法弄明白你尝试在这里做什么。如果目标是在单个链接列表中的 pos 位置插入元素,那么您要做的是:
分配新元素n
。
如果pos
为零,请将新元素n
设为根,并使n->next
指向当前根,然后就完成了。
否则在列表中重复pos-1
次,称之为x
。
制作n->next->next = x->next
(如果n->next
存在)
制作n->next = x