C SEGFULT和逻辑错误
我正在制作一个链表程序,它利用几个函数来简化从列表中添加或删除节点的过程。我相信我的逻辑是可以分配和添加一个新节点,但我仍然得到一个seg故障。你能看一下我的逻辑并解释seg故障的原因吗?我对链表非常缺乏经验。谢谢大家! 这是我的函数声明C SEGFULT和逻辑错误,c,linked-list,C,Linked List,我正在制作一个链表程序,它利用几个函数来简化从列表中添加或删除节点的过程。我相信我的逻辑是可以分配和添加一个新节点,但我仍然得到一个seg故障。你能看一下我的逻辑并解释seg故障的原因吗?我对链表非常缺乏经验。谢谢大家! 这是我的函数声明 #define SIMPLELL_H #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }node
#define SIMPLELL_H
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}node_t;
node_t* head;
void printList();
void append(int num);
void addFront(int num);
void deleteList();
void removeNode(int num);
int length();
#endif
这是我不需要更改的驱动程序功能
#include "SimpleLL.h"
#include "SimpleLL.c"
int main()
{
/*head is a global variable*/
head = NULL;
int size =0;
removeNode(1);
append(2);
append(3);
addFront(1);
append(4);
printList();
size = length();
printf("size now %d\n",size);
removeNode(8);
printList();
removeNode(1);
printList();
removeNode(4);
printList();
deleteList();
printList();
size = length();
printf("size after deletion %d\n",size);
return 0;
}
removeNode
不包含到达列表末尾的测试。因此,如果在列表中找不到该值,它将在末尾取消对空指针的引用并崩溃
第一个测试就是这种情况,当列表为空时尝试删除节点,对于removeNode(8)
您的
removeNode
函数还需要free()。当前,它正在释放在删除节点后出现的节点,该节点仍在列表中,并且在以后访问时将导致未定义的行为。removeNode
不包含到达列表末尾的测试。因此,如果在列表中找不到该值,它将在末尾取消对空指针的引用并崩溃
第一个测试就是这种情况,当列表为空时尝试删除节点,对于removeNode(8)
您的removeNode
函数还需要free()。当前,它释放了一个被删除的节点,它仍然在列表中,并且在稍后访问它时会导致未定义的行为。 <代码> /*Head是一个全局变量*/< /代码>,这是一个非常糟糕的想法。考虑当“列表”为空时,在<代码>追加< /代码>中发生了什么。prev
有什么值?它应该是NULL
正确吗?在这种情况下,我是否应该使用if语句来说明head/prev
何时为NULL?这会有所帮助。还请注意,printList
将始终打印“此列表为空。\n”
。这可能不是预期的行为。所以我编辑了我的append函数以包含if语句,但是,我仍然得到一个seg错误。我知道这个seg故障发生在append函数中,但是我仍然不确定是什么原因导致它。我假设这是我的Malc函数,但我不知道为什么它会导致SEG故障。<代码> /*Head是一个全局变量*/< /Cord>这是一个非常糟糕的想法。考虑“代码”>“<”/代码>当“列表”为空时发生了什么。prev
有什么值?它应该是NULL
正确吗?在这种情况下,我是否应该使用if语句来说明head/prev
何时为NULL?这会有所帮助。还请注意,printList
将始终打印“此列表为空。\n”
。这可能不是预期的行为。所以我编辑了我的append函数以包含if语句,但是,我仍然得到一个seg错误。我知道这个seg故障发生在append函数中,但是我仍然不确定是什么原因导致它。我假设这是我的malloc功能,但我不确定它为什么会导致seg故障。感谢您的快速响应。我现在已经修复了这个问题,但是我的函数在修复之后仍然存在seg故障。我认为我的addnode函数有问题,但我不确定它是什么。我会更新我的帖子shortly@Arock475:您尚未修复它-如果列表不是空的,但所需的数字不在其中,会发生什么情况?与removeNode(8)
的情况一样。你完全正确,我没有想到这一点。感谢you@Arock475:您的free()
不正确-请参阅编辑。我认为我已经修复了free()问题,并且已经修复了它,因此如果该值不在链接列表中,它将正确打印错误消息并退出。感谢您的快速响应。我现在已经修复了这个问题,但是我的函数在修复之后仍然存在seg故障。我认为我的addnode函数有问题,但我不确定它是什么。我会更新我的帖子shortly@Arock475:您尚未修复它-如果列表不是空的,但所需的数字不在其中,会发生什么情况?与removeNode(8)
的情况一样。你完全正确,我没有想到这一点。感谢you@Arock475:您的free()
不正确-请参阅编辑。我认为我已修复free()问题,并且已修复该问题,因此如果该值不在链接列表中,它将正确打印错误消息并退出。
#include "SimpleLL.h"
#include "SimpleLL.c"
int main()
{
/*head is a global variable*/
head = NULL;
int size =0;
removeNode(1);
append(2);
append(3);
addFront(1);
append(4);
printList();
size = length();
printf("size now %d\n",size);
removeNode(8);
printList();
removeNode(1);
printList();
removeNode(4);
printList();
deleteList();
printList();
size = length();
printf("size after deletion %d\n",size);
return 0;
}