Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C SEGFULT和逻辑错误_C_Linked List - Fatal编程技术网

C SEGFULT和逻辑错误

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

我正在制作一个链表程序,它利用几个函数来简化从列表中添加或删除节点的过程。我相信我的逻辑是可以分配和添加一个新节点,但我仍然得到一个seg故障。你能看一下我的逻辑并解释seg故障的原因吗?我对链表非常缺乏经验。谢谢大家!

这是我的函数声明

#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;
}