Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
向链表添加节点时出现分段错误 Node*orderedInsert(Node*p,int-newval) /*使用数据值newval分配新节点 并使用 第一个节点指针p,其方式如下: “修改”列表中的数据值位于 遍历列表时的升序。 */ { 节点*当前=空; Node*prev=NULL; Node*newNode=(Node*)malloc(sizeof(Node)); newNode->next=NULL; newNode->data=newval; if(newNode==NULL) printf(“无法为新节点分配内存”); 电流=p; if(p==NULL){ p=新节点; newNode->next=NULL; newNode->data=newval; 返回p; } else if(newvaldata){ newNode->next=p; p=新节点; 返回p; } 否则{ prev=p; 当前=当前->下一步; while(newNode->data>current->data&¤t!=NULL){ prev=当前值; 当前=当前->下一步; } 如果(prev->next==NULL){//我想错误就在这里的某个地方 prev->next=newNode; newNode->data=newval; newNode->next=NULL; 返回p; } 否则{ 新建节点->下一步=当前; prev->next=newNode; 返回p; } } }_C_Linked List_Segmentation Fault - Fatal编程技术网

向链表添加节点时出现分段错误 Node*orderedInsert(Node*p,int-newval) /*使用数据值newval分配新节点 并使用 第一个节点指针p,其方式如下: “修改”列表中的数据值位于 遍历列表时的升序。 */ { 节点*当前=空; Node*prev=NULL; Node*newNode=(Node*)malloc(sizeof(Node)); newNode->next=NULL; newNode->data=newval; if(newNode==NULL) printf(“无法为新节点分配内存”); 电流=p; if(p==NULL){ p=新节点; newNode->next=NULL; newNode->data=newval; 返回p; } else if(newvaldata){ newNode->next=p; p=新节点; 返回p; } 否则{ prev=p; 当前=当前->下一步; while(newNode->data>current->data&¤t!=NULL){ prev=当前值; 当前=当前->下一步; } 如果(prev->next==NULL){//我想错误就在这里的某个地方 prev->next=newNode; newNode->data=newval; newNode->next=NULL; 返回p; } 否则{ 新建节点->下一步=当前; prev->next=newNode; 返回p; } } }

向链表添加节点时出现分段错误 Node*orderedInsert(Node*p,int-newval) /*使用数据值newval分配新节点 并使用 第一个节点指针p,其方式如下: “修改”列表中的数据值位于 遍历列表时的升序。 */ { 节点*当前=空; Node*prev=NULL; Node*newNode=(Node*)malloc(sizeof(Node)); newNode->next=NULL; newNode->data=newval; if(newNode==NULL) printf(“无法为新节点分配内存”); 电流=p; if(p==NULL){ p=新节点; newNode->next=NULL; newNode->data=newval; 返回p; } else if(newvaldata){ newNode->next=p; p=新节点; 返回p; } 否则{ prev=p; 当前=当前->下一步; while(newNode->data>current->data&¤t!=NULL){ prev=当前值; 当前=当前->下一步; } 如果(prev->next==NULL){//我想错误就在这里的某个地方 prev->next=newNode; newNode->data=newval; newNode->next=NULL; 返回p; } 否则{ 新建节点->下一步=当前; prev->next=newNode; 返回p; } } },c,linked-list,segmentation-fault,C,Linked List,Segmentation Fault,我只是在添加一个比任何其他节点都大的节点时(这意味着它将位于列表的末尾)才会出现分段错误。如果我按43 2 1或42 1 3的顺序输入它们就可以了,但如果我按12的顺序输入就不行了。使用您添加1和2的示例 第一次迭代将成功 Node *orderedInsert(Node *p, int newval) /* Allocates a new Node with data value newval and inserts into the ordered list with firs

我只是在添加一个比任何其他节点都大的节点时(这意味着它将位于列表的末尾)才会出现分段错误。如果我按43 2 1或42 1 3的顺序输入它们就可以了,但如果我按12的顺序输入就不行了。

使用您添加1和2的示例

第一次迭代将成功

Node *orderedInsert(Node *p, int newval)
/* Allocates a new Node with data value newval
   and inserts into the ordered list with 
   first node pointer p in such a way that the
   data values in the modified list are in 
   ascending order as the list is traversed.
*/
{
   Node* current = NULL;
   Node* prev = NULL;
   Node* newNode = (Node*)malloc(sizeof(Node));
   newNode->next = NULL;
   newNode->data = newval;

   if(newNode == NULL)
      printf("Could not allocate memory for new node");

   current = p;   

   if(p == NULL){

      p = newNode;
      newNode->next = NULL;
      newNode->data = newval;
      return  p;
   }
   else if(newval < p->data){
      newNode->next = p;
      p = newNode;
      return p;
   }
   else{ 
      prev = p;
      current = current->next; 



      while(newNode->data > current->data && current != NULL){

         prev = current;
         current = current->next;
      }
      if(prev->next == NULL){//the error is located somewhere here I think
         prev->next = newNode;
         newNode->data = newval;
         newNode->next = NULL;
         return p;   
      }
      else{
         newNode->next = current;
         prev->next = newNode;
         return p;
      }
   }   
}
然后下一个指针指向NULL

然后,当您添加2时,您将点击:

if(p == NULL){
  p = newNode;
  newNode->next = NULL;
  newNode->data = newval;
  return  p;
}

此处
current->next
为空。将其分配给
current
后,
current
为空。

这是不够的:
如果(newNode==NULL)printf(“无法为新节点分配内存”)-您必须确保函数不使用
newNode
,因此它必须返回或退出。此外,应该在标准错误上报告错误,而不是标准输出。
while(newNode->data>current->data&¤t!=NULL){
应该是
while(current!=NULL&&newNode->data>current->data){
请学习如何使用调试器,和/或学习如何将适当的打印语句放入代码中,以便您可以通过查看程序执行时发现问题,和/或学习如何从
使用
断言()
。在紧急情况下(内核转储),在使用指针之前检查指针是否不为空:
assert(current!=null)
或同等版本。谢谢!在while循环中,当它与空值进行大于比较时,会导致分段错误?我认为这只是在您尝试修改内存时造成的。当
当前
为空时,您无法读取
当前>下一个
。因为您有空值测试在使用
current
之后(而不是之前)崩溃。
else{ 
  prev = p;
  current = current->next; 

  while(newNode->data > current->data && current != NULL){
    ...
  }