【发布时间】:2016-03-24 20:08:57
【问题描述】:
我正在尝试创建一个名为IntNode *interleave_lists(IntNode *head_1, IntNode *head_2); 的链表函数,它接受两个链表,将它们组合起来并返回一个指向头部的指针。
示例:假设 head_1 指向一个包含三个整数的链表:1、3、5 和 head_2 指向一个包含 5 个整数的链表:10、11、12、13、14。新的链表将包含 8 整数,按以下顺序:1、10、3、11、5、12、13、14。
我有这些结构来帮助创建链表:
struct intnode {
int value;
struct intnode *next;
};
typedef struct intnode IntNode;
IntNode *intnode_construct(int value, IntNode *next)
{
IntNode *p = malloc(sizeof(IntNode));
assert (p != NULL);
p->value = value;
p->next = next;
return p;
}
void print_linked_list(IntNode *p) //for printing linked list
{
if (p == NULL) {
printf("empty list");
return;
}
/* Print every node in the linked list except the last one,
using the format: value1 -> value2 -> value3 -> ...
*/
for (; p->next != NULL; p = p->next) {
printf("%d -> ", p->value);
}
/* Print the last node. */
printf("%d", p->value);
}
现在尝试创建我拥有的功能:
IntNode *interleave_lists(IntNode *head_1, IntNode *head_2)
{
int count = 1;
IntNode *p1=head_1, *p2=head_2,*head=NULL;
for(; (p1->next != NULL) || (p2->next != NULL); p1 = p1->next, p2 = p2->next){
if(p1 != NULL && count == 1){
head = intnode_construct(p1->value,head);
count = 0;
} else if(p2 != NULL && count == 0){
head = intnode_construct(p2->value,head);
}
}
return head;
}
但每次我运行它时,控制台都会显示 CRT: unhandled exception (main) -- terminating。 我对此功能的测试用例:
int main(void)
{
IntNode *list1 = NULL,*list2 = NULL; // An empty linked list.
list1 = intnode_construct(5, list1);
list1 = intnode_construct(3, list1);
list1 = intnode_construct(1, list1);
list2 = intnode_construct(14, list2);
list2 = intnode_construct(13, list2);
list2 = intnode_construct(12, list2);
list2 = intnode_construct(11, list2);
list2 = intnode_construct(10, list2);
IntNode *head = NULL;
head = interleave_lists(list1, list2);
print_linked_list(head);
}
【问题讨论】:
-
崩溃发生在哪一行?如果您不知道,请使用调试器查找。
-
我猜
p->next = next;应该是p->next = NULL; -
顺便说一句,如果需要,您可以使 interleave 函数对现有列表进行操作,以避免复制所有节点。取决于您以后是否要保留原始列表。
标签: arrays c pointers heap-memory dynamic-memory-allocation