我正在尝试创建一个函数splitlist(),它将单个链接列表拆分为两个子列表 - 一个用于前半部分,一个用于后半部分。我已经提出了一个下面的代码,它将在我第一次调用该函数时工作,但是当我重复调用该函数时,程序崩溃了。关于如何更改代码以防止出现此类错误的任何建议?函数splitlist()为void,因为它打印了两个包含frontList和backList的列表。
typedef struct _listnode {
int item;
struct _listnode *next;
} ListNode;
typedef struct _linkedlist {
int size;
ListNode *head;
} LinkedList;
void splitlist(LinkedList* list1, LinkedList * firsthalf, LinkedList *secondhalf)
{
ListNode *cur = list1->head;
ListNode *front = firsthalf->head;
ListNode *back = secondhalf->head;
int totalnodes = list1->size;
int i;
if (totalnodes % 2 != 0) //if odd number of elements, add 1 to make it easier for traversal of list
{
totalnodes = totalnodes + 1;
}
int halfnodes = totalnodes / 2;
{
for (i = 0; i < halfnodes; i++)
{
if (firsthalf->head == NULL) //initialise the head
{
firsthalf->head = malloc(sizeof(ListNode)); //create first node
front = firsthalf->head;
}
else
{
front->next = malloc(sizeof(ListNode));
front = front->next;
}
front->item = cur->item; // insert value from list1 into firsthalf
cur = cur->next; //point to next node in list1
}
front->next = NULL; //last node
for (i = halfnodes; i < totalnodes; i++)
{
if (secondhalf->head == NULL)
{
secondhalf->head = malloc(sizeof(ListNode));
back = secondhalf->head;
}
else
{
back->next = malloc(sizeof(ListNode));
back = back->next;
}
back->item = cur->item;
cur = cur->next;
}
back->next = NULL;
}
}
答案 0 :(得分:1)
这段代码有很多问题。首先,不检查malloc返回值,malloc可能会失败。而且我强烈怀疑因为malloc失败,你的程序停止了。你反复在函数内部分配内存,但是当你不再需要它时你会释放它吗?你为什么要使用malloc? 如前所述,您不需要。
请发布函数的调用方式,因为我们真的不清楚如何使用LinkedList* list1, LinkedList * firsthalf, LinkedList *secondhalf
。另外还不清楚LinkedList的结构是什么。
答案 1 :(得分:0)
为什么要使用malloc?它会创建一个新列表。但我们想要拆分列表。 我猜firsthalf和后半部分是NULL
void splitlist(LinkedList* list1, LinkedList * firsthalf, LinkedList *secondhalf)
{
ListNode *cur = list1->head;
ListNode *front;
int totalnodes = list1->size;
int i;
if (totalnodes % 2 != 0) //if odd number of elements, add 1 to make it easier for traversal of list
{
totalnodes = totalnodes + 1;
}
int halfnodes = totalnodes / 2;
firsthalf->head=list1->head;
front=firsthalf->head;
for(i=0;i<halfnode;i++)
front=front->next;
secondhalf->head=front->next;
front->next=NULL;
}
答案 2 :(得分:0)
乍一看,我看不出你的代码有多大错误(假设分配是在新的半列表中创建列表节点的副本),所以错误可能在于你如何调用函数,如一个例子,可能是:
LinkedList mainlist= {0};
LinkedList firsthalf= {0}, secondhalf= {0};
//mainlist got filled somehow; we now want to split
firsthalf->List= malloc(sizeof(ListNode));
secondthalf->List= malloc(sizeof(ListNode));
memset(firsthalf->List, 0, sizeof(ListNode));
memset(secondhalf->List, 0, sizeof(ListNode));
splitlist(&mainlist, &firsthalf, &secondhalf);