今天我们来看一个链表的操作问题,题目要求编写一个函数,将链表分成奇数链和偶数链,每个链中的数据从小到大排列。程序中不得使用malloc申请空间
审题:首先不能使用malloc申请新的空间就是说不能申请新的链表来放奇数偶数链表。因此就需要在原来链表的基础上进行操作。但是进行操作时需要考虑,先排序还是先判断奇偶性。如果先判断奇偶性再排序会造成和排序函数在两个链表中调用2次。因此我们选择先排序在进行选择奇偶判断。在排序好的链表中先将这个链表从头断开,然后将后面那部分的链表一次向后进行判断,如果节点的数据域是奇数将其放到传入进来的头节点,如果是偶数放到原先的头节点。这样就能实现链表的断开和排序。
首先是参数问题,这个函数应该有几个参数?
我们函数最终的结果是产生2个链表,但是创建的链表只有一个,所以如果只有一个参数在函数中那么必然会导致断开链的丢失。因此我们需要再申请一个头来连接奇数链。其次就是这个所用指针的问题,这里采用三个指针。小编尝试了很多次双指针最后会导致后面部分节点链断不开。下面来看代码
void differ(SLIST* psl,SLIST* psl1)//先进行排序后再分奇偶
{
slistSort(psl);
//链表排序完成,p q 均指向链表最后排序的那个节点
Listnode* S = psl->first;//避免链表散架定义新的指针指向链表,这个作为新的头
Listnode* Temp = S->next;
Listnode* P = Temp;
psl->last = S;
S->next = NULL;
while ( P != NULL)//偶数链
{
Temp = P;
if (Temp->data % 2 == 0)
{
psl->last->next = Temp;
psl->last = Temp;
}
else//奇数链
{
psl1->last->next = Temp;
psl1->last = Temp;
}
P = P->next;
Temp->next = NULL;//指针后移动
}
}