【发布时间】:2016-03-30 14:00:28
【问题描述】:
我正在合并两个按升序排序的排序列表。我正在使用两个函数来完成这个任务:
第一个是Node *MergedSort(Node *a, Node *b),它将两个排序列表的头节点合并在一起。
还有一个实用函数 void MoveNode(Node **dest, Node **source),它将源链表的头节点放在目标链表的顶部。并使源链表的头部指向它的下一个元素。
这是我执行此任务的代码:
typedef struct container{
int data;
struct container *next;
} Node;
void MoveNode(Node **dest, Node **source){
Node *newNode = *source;
//Now source points to its second node;
*source = newNode->next;
//Connecting newNode to dest.
newNode->next = *dest;
//Now destination head points to newNode
*dest = newNode;
return;
}
Node *MergedSort(Node *a, Node *b){
Node dummy;
Node *tail = &dummy;
dummy.next = NULL;
while(1){
if (a == NULL){
tail->next = b;
break;
}
else if (b == NULL){
tail->next = a;
break;
}
else if (a->data < b->data){
MoveNode(&(tail->next), &a);
}
else{
MoveNode(&(tail->next), &b);
}
tail = tail->next;
}
return (dummy.next);
}
现在的问题是,如果我在这段代码中做一个小改动,即将 dummy 定义为指向 Node 的指针,它会给我分段错误。这是错误的代码,稍作改动,dummy 的声明现在是 Node *dummy:
void MoveNode(Node **dest, Node **source){
Node *newNode = *source;
//Now source points to its second node;
*source = newNode->next;
//Connecting newNode to dest.
newNode->next = *dest;
//Now destination head points to newNode
*dest = newNode;
return;
}
Node *MergedSort(Node *a, Node *b){
Node *dummy; // This slight change gave me segmentation fault.
Node *tail = dummy;
dummy->next = NULL;
while(1){
if (a == NULL){
tail->next = b;
break;
}
else if (b == NULL){
tail->next = a;
break;
}
else if (a->data < b->data){
MoveNode(&(tail->next), &a);
}
else{
MoveNode(&(tail->next), &b);
}
tail = tail->next;
}
return (dummy->next);
}
我无法弄清楚为什么当我这样做时程序会崩溃,尽管早期的实现和后面的实现在逻辑上对我来说看起来是一样的。
【问题讨论】:
-
Node长什么样子? -
dummy->next = NULL;。这是无效的,因为dummy没有初始化。很可能会导致该行出现段错误。 -
我在代码中添加了Node的定义。请看一看。
-
但同样的 un 初始化在前一个实现中唯一的区别是 dummy 不是指向节点的指针
标签: c