将链表拆分为一半

时间:2015-11-13 10:44:16

标签: c list pointers split

我正在尝试创建一个函数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;
    }

}

3 个答案:

答案 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);