【发布时间】:2015-10-31 06:19:21
【问题描述】:
我在尝试将两个已排序的链表合并为一个时遇到了一些问题。这是我的代码:
void sortedMerge(LinkedList *l1, LinkedList *l2, LinkedList *result)
{
int i = 0;
while (l1->size > 0 && l2->size > 0) {
if (l1->head < l2->head) {
removeNode(l1, 0);
insertNode(result, i++, l1->head);
}
else {
removeNode(l2, 0);
insertNode(result, i++, l2->head);
}
}
}
int insertNode(LinkedList *ll, int index, int value)
{
ListNode *pre, *cur;
if (ll == NULL || index < 0 || index > ll->size + 1)
return -1;
if (ll->head == NULL || index == 0) {
cur = ll->head;
ll->head = malloc(sizeof(ListNode));
ll->head->item = value;
ll->head->next = cur;
ll->size++;
return 0;
}
if ((pre = findNode(ll, index - 1)) != NULL) {
cur = pre->next;
pre->next = malloc(sizeof(ListNode));
pre->next->item = value;
pre->next->next = cur;
ll->size++;
return 0;
}
return -1;
}
int removeNode(LinkedList *ll, int index)
{
ListNode *pre, *cur;
if (ll == NULL || index < 0 || index >= ll->size)
return -1;
if (index == 0) {
cur = ll->head->next;
free(ll->head);
ll->head = cur;
ll->size--;
return 0;
}
if ((pre = findNode(ll, index - 1)) != NULL) {
if (pre->next == NULL)
return -1;
cur = pre->next;
pre->next = cur->next;
free(cur);
ll->size--;
return 0;
}
return -1;
}
我的主要功能中的代码 sn-p:
case 1:
printf("Input an integer that you want to add to the linked list 1:\n");
scanf("%d", &i);
j = insertSortedLinkedList(&ll1, i);
printf("Linked list 1 : ");
printList(&ll1);
break;
case 2:
printf("Input an integer that you want to add to the linked list 2:\n");
scanf("%d", &i);
j = insertSortedLinkedList(&ll2, i);
printf("Linked list 2 : ");
printList(&ll2);
break;
case 3:
sortedMerge(&ll1, &ll2, &resultMergedList);
printf("The resulting linked list is:\n");
printList(&resultMergedList);
break;
所以我为 l1 输入了2,4,6,为 l2 输入了1,2,3。预期的输出应该是1,2,2,3,4,6。但是,我收到了4229048, 4228432, 4228565, 0。
我在想是不是因为我得到的输出是内存位置?
有什么想法吗?提前致谢。
【问题讨论】:
-
main 函数基本上是获取 l1 和 l2 的输入,然后调用 sortedMerge。在 sortedMerge 内部,我然后调用 removeNode 和 insertNode
-
复制和调试问题的唯一方法是使用工作程序(可能是 main 中发生的其他未定义行为)
-
insortedLinkedList() 工作正常,因为它来自我的其他问题。因为太长我没有发。基本上,该功能是填充 l1 和 l2。
-
被否决为无法调试的不完整程序 - 请参阅 mvce 特别是完整部分
-
您发布了一个小 sn-p 提示另一个功能(也未发布)。创建 mvce 的一部分是将问题减少到具有相同问题的最小程序。如果您无法做到这一点,至少有一个完整的程序可以复制该问题
标签: c pointers linked-list nodes