向链表添加节点时出现分段错误 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; } } }
我只是在添加一个比任何其他节点都大的节点时(这意味着它将位于列表的末尾)才会出现分段错误。如果我按43 2 1或42 1 3的顺序输入它们就可以了,但如果我按12的顺序输入就不行了。使用您添加1和2的示例 第一次迭代将成功向链表添加节点时出现分段错误 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
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){
...
}