因为自己写程序栽在这个问题上了,所以就手写+机试的敲了一下,虽然很小心,但是机试的时候依然写出了bug,所以发这篇帖子算是让自己长长记性吧。
问题如下:
1.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法
代码如下:
#include <stdio.h>
#include <stdlib.h>
struct LinkNode
{
int data;
LinkNode *pNext;
LinkNode(int _data)
{
data = _data;
pNext = NULL;
}
};
LinkNode* MergeLink(LinkNode *pLeftLink, LinkNode *pRightLink)
{
LinkNode *ph = NULL, *p = NULL;
while (pLeftLink && pRightLink)
{
if(pLeftLink->data < pRightLink->data)
{
if(ph == NULL)
{
ph = p = pLeftLink;
pLeftLink = pLeftLink->pNext;
}
else
{
p->pNext = pLeftLink;
p = p->pNext;
pLeftLink = pLeftLink->pNext;
}
}
else
{
if(ph == NULL)
{
ph = p = pRightLink;
pRightLink = pRightLink->pNext;
}
else
{
p->pNext = pRightLink;
p = p->pNext;
pRightLink = pRightLink->pNext;
}
}
}
p->pNext = (pLeftLink == NULL) ? pRightLink : pLeftLink;
return ph;
}
LinkNode *MergeSort(LinkNode *pHead, int len)
{
if(len == 1)
{
pHead->pNext = NULL;
return pHead;
}
//当时这里就写出了bug,我是先运算了MergeSort(pHead, len/2),然后用那个phead来求pRightStart
LinkNode *pRightStart = pHead;
for(int i = 0;i < len / 2; i++)
{
pRightStart = pRightStart->pNext;
}
LinkNode *pLeftHalf = MergeSort(pHead, len/2);
LinkNode *pRightHalf = MergeSort(pRightStart, len - len/2);
LinkNode *pMergedLink = MergeLink(pLeftHalf, pRightHalf);
return pMergedLink;
}
void PrintAll(LinkNode *pHead)
{
int i = 1;
while(pHead)
{
printf("%d ", pHead->data);
pHead = pHead->pNext;
if(i++ % 20 == 0)
{
printf("\n");
}
}
}
int main()
{
LinkNode *pHead = NULL;
LinkNode *pCurrent = NULL;
int flags[300] = {0};
for(int i = 0; i < 10; )
{
int num = rand()%300;
if(flags[num])
{
continue;
}
else
{
flags[i] = 1;
i++;
LinkNode *pNewNode = new LinkNode(num);
if(pHead == NULL)
{
pHead = pCurrent = pNewNode;
}
else
{
pCurrent->pNext = pNewNode;
pCurrent = pCurrent->pNext;
}
}
}
PrintAll(pHead);
printf("\n\n\n");
pHead = MergeSort(pHead, 10);
PrintAll(pHead);
return 0;
}