gpt4 book ai didi

C:链表的合并排序,合并子数组在排序函数中未正确捕获

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:48 25 4
gpt4 key购买 nike

根据维基百科网站上的合并排序伪代码,我可以深入了解一个节点正确合并到两个节点列表中的基本情况。但是,我认为合并的部分在它们移回递归链时会反转。

我正在使用 Makefile:

sort: main.c sort.c
gcc -Wall -std=c99 -o $@ main.c sort.c ll.c

我正在使用包含头指针和尾指针的列表头结构。 Head 指向第一个节点,tail 指向最后一个节点。
合并功能正在运行,但这里是排序功能。

void list_sort(list_t *list)
{
printf("in sort 1\n");

//base case of 0 or 1 element
if (list->head == NULL || list->head->next == NULL) {
return;
}

list_t *sublistA = list_create();
assert(sublistA);
list_t *sublistB = list_create();
assert(sublistB);

int len = Length(list);
int mid = (len) / 2;
printf("mid is %d\n", mid);
int i = 0;
element_t *current = list->head;
//make sublists
while (i < len) {
if (i < mid) {
printf("append sublistA\n");
list_append(sublistA, current->val);
} else {
printf("append sub B\n");
list_append(sublistB, current->val);
}
i++;
current = current->next;
}
list_print(sublistA);
list_print(sublistB);

printf("going to sort A\n");
list_sort(sublistA);

printf("going to sort B\n");
list_sort(sublistB);
//this was just added to capture returned list from merge
list_t* capture = NULL;
assert(capture);//the assertion failed
capture = merge(sublistA, sublistB);
}

编辑:断言失败所以我切换到:

list_t* capture = list_create();
assert(capture);

capture = merge(sublistA, sublistB);

我确定它没有从 main、merge 和 sort 中的 printf 语句中正确捕获。

这是显示意外反转的命令行输出:

/* left and right lists to merge://at the start of the merge function
{ 8, }
{ 7, }
in merge while 1
in merge else 1
{ 7, }
final result
{ 7, 8, }//yay! this is the last line of merge function
in merge//came right back again to merge
left and right lists to merge:
{ 9, }
{ 8, 7, }//doh!*/

编辑:这是合并函数:

list_t *merge(list_t *left, list_t *right) {
printf("in merge\n");
list_t *result = list_create();
assert(result);

element_t *curr1 = left->head;
element_t *curr2 = right->head;
//list_t *result = list_create();
printf("left and right lists to merge: \n");
list_print(left);
list_print(right);

while (curr1 != NULL && curr2 != NULL) {
printf("in merge while 1\n");
if (curr1->val <= curr2->val) {
list_append(result, curr1->val);
printf("merge while 1 if\n");
curr1 = curr1->next;
//curr2 = curr2->next;
}
else //curr1->val > curr2->val
{
printf("in merge else 1\n");
list_append(result, curr2->val);
curr2 = curr2->next;
}
}
list_print(result);

//leftovers need to be allocated
while (curr1 != NULL) {
list_append(result, curr1->val);
curr1 = curr1->next;
}

while (curr2 != NULL) {
list_append(result, curr2->val);
curr2 = curr2->next;
}

//printf("curr1->val is %d\n", curr1->val);
//printf("curr2->val is %d\n", curr2->val);
list_destroy(left);
list_destroy(right);
printf("final result\n");
list_print(result);

return result;
}

最佳答案

我注意到您的 merge 函数通过破坏性地修改输入列表来工作:您将两个列表作为输入,生成一个新的合并列表作为输出,然后返回结果列表。但是,在您的 list_sort 函数中,您没有捕获返回的新列表,因此您没有更新提供的输入列表来保存新排序的序列。 try catch merge 的返回值并使用它来更新输入列表参数。

关于C:链表的合并排序,合并子数组在排序函数中未正确捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45555053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com