【发布时间】:2021-02-26 22:10:01
【问题描述】:
我有一个任务,我必须在不创建新列表的情况下按升序将 2 个链表组合到一个函数中。像这样的东西:[1.3-->3.2-->4.6-->7.0] & [2.7-->2.9-->5.1] -> [1.3-->2.7-->2.9-->3.2-->4.6-->5.1-->7.0]。我有整个代码,但监控程序一直报告相同:MEMORY LEAK。
这是我的代码(只有函数部分和struct 定义):
typedef struct _listelem {
double data;
struct _listelem *next;
} listelem;
listelem *merge(listelem *a, listelem *b) {
listelem *lemarado = NULL;
listelem *mozgo = a;
listelem *elol2 = b;
lemarado = mozgo;
if (elol2 == NULL) // if the list is zero
return a;
else
if (mozgo == NULL)
return b;
if (mozgo->next == NULL) { //if the first list has only one element
while (elol2 != NULL) {
listelem *vege;
vege = (listelem *)malloc(sizeof(listelem));
vege->data = elol2->data;
lemarado->next = vege;
free(vege);
lemarado = lemarado->next;
elol2 = elol2->next;
}
lemarado->next = NULL;
return a;
}
mozgo = mozgo->next; // I am maintaining a pointer which points to the next data, and a pointer
while (mozgo != NULL) { // Which points to the data before, and I stick an element between them
if (elol2 == NULL) {
while (mozgo != NULL)
mozgo = mozgo->next;
while (lemarado != NULL)
lemarado = lemarado->next;
return a;
}
if (mozgo->data > elol2->data) {
listelem *hozzafuz;
hozzafuz = (listelem *)malloc(sizeof(listelem));
hozzafuz->data = elol2->data;
lemarado->next = hozzafuz;
hozzafuz->next = mozgo;
elol2 = elol2->next;
lemarado = lemarado->next;
} else {
mozgo = mozgo->next;
lemarado = lemarado->next;
}
if (mozgo == NULL) {
while (elol2 != NULL) {
listelem *vege;
vege = (listelem *)malloc(sizeof(listelem));
vege->data = elol2->data;
lemarado->next = vege;
free(vege);
lemarado = lemarado->next;
elol2 = elol2->next;
}
lemarado->next = NULL;
}
}
return a;
}
【问题讨论】:
-
请注意,您的代码也存在 use-after-free 问题。
-
.. without creating a new list. -
显示的输入已经排序,因此从一个新的头指针开始,您可以将下一个项目链接到两个输入中较小的数据中,然后前进到下一个项目。当其中一个变为
NULL时,您只需在一次操作中链接另一个列表的全部剩余内容。
标签: c memory memory-leaks linked-list out-of-memory