函数实现:
PNode Reserse_LinkList(PNode *pHead)//逆置单链表
{
//方法1:利用三个指针实现
PNode PreNode = NULL;
PNode CurNode = NULL;
PNode NextNode = NULL;
assert(pHead);
if(NULL == *pHead || NULL == (*pHead)->next)
return NULL;
else
{
PreNode = *pHead;
CurNode = PreNode->next;
NextNode = CurNode->next;
(*pHead)->next = NULL;
while(NextNode->next)
{
NextNode = CurNode->next;
CurNode->next = PreNode;
PreNode = CurNode;
CurNode = NextNode;
}
NextNode->next = PreNode;//将最后一个元素连接上
return NextNode;
}
}
void Bubbleort(PNode pHead)//冒泡排序
{
int flag = 0;
PNode CurNode = NULL;
PNode TailNode = NULL;
assert(pHead);
if(NULL == pHead || NULL == (pHead)->next)
return;
CurNode = pHead;
while(TailNode != pHead)//升序
{
flag = 0;
CurNode = pHead;
while(CurNode->next != TailNode)
{
if(CurNode->data > CurNode->next->data)
{
DataType temp = CurNode->data;
CurNode->data = CurNode->next->data;
CurNode->next->data = temp;
flag = 1;
}
CurNode = CurNode->next;
}
TailNode = CurNode;
if(flag == 0)
break;
}
}
PNode MergeOrder_LinkList(PNode pList1,PNode pList2)//合并两个有序链表,合并后仍有序
{
PNode p1 = pList1;
PNode p2 = pList2;
PNode NewNode = NULL;
PNode pNewHead = NewNode;
if(NULL == pList2)
return pList1;
if(NULL == pList1)
return pList2;
else
{
if(p1->data < p2->data)
{
NewNode = p1;
p1 = p1->next;
}
else
{
NewNode = p2;
p2 = p2->next;
}
pNewHead = NewNode;
while(p1 && p2)//假设都为升序
{
if(p1->data < p2->data)
{
NewNode->next = p1;
NewNode = p1;
p1 = p1->next;
}
else
{
NewNode->next = p2;
NewNode = p2;
p2 = p2->next;
}
}
if(NULL == p1)
{
NewNode->next = p2;
}
if(NULL == p2)
{
NewNode->next = p1;
}
return pNewHead;
}
}
int CheckCross(PNode pList1,PNode pList2)//判断链表是否相交
{
PNode p1 = pList1;
PNode p2 = pList2;
if(NULL == pList2 || NULL == pList1)
return 0;
while(p1->next)
{
p1 = p1->next;
}
while(p2->next)
{
p2 = p2->next;
}
if(p1 == p2)
return 1;
else
return 0;
}
PNode Cross(PNode pList1,PNode pList2)//求两个链表相交的交点
{
int count1 = 0;
int count2 = 0;
PNode p1 = pList1;
PNode p2 = pList2;
if(NULL == pList2 || NULL == pList1)
return 0;
while(p1->next)
{
p1 = p1->next;
count1++;
}
while(p2->next)
{
p2 = p2->next;
count2++;
}
p1 = pList1;
p2 = pList2;
if(count1 - count2 >= 0)
{
int temp = count1 - count2;
while(temp--)
{
p1 = p1->next;
}
}
else
{
int temp = count2 - count1;
while(temp--)
{
p2 = p2->next;
}
}
while(p1->next)
{
if(p1 == p2)
break;
else
{
p1 = p1->next;
p2 = p2->next;
}
}
if(p1 == p2)
return p1;
else
return NULL;
}
测试代码:
void test4()
{
PNode pNode = NULL;
PNode pRet = NULL;
Init_LinkList(&pNode);
PushBack(&pNode,2);
PushBack(&pNode,5);
PushBack(&pNode,1);
PushBack(&pNode,4);
PushBack(&pNode,3);
Print_LinkList(pNode);
pRet = Reserse_LinkList(&pNode);
Print_LinkList(pRet);
Bubbleort(pRet);
Print_LinkList(pRet);
Destroy(&pNode);
}
//void test5()
//{
// PNode pNode1 = NULL;
// PNode pNode2 = NULL;
// PNode pRet = NULL;
// Init_LinkList(&pNode1);
// Init_LinkList(&pNode2);
// PushBack(&pNode1,1);
// PushBack(&pNode1,3);
// PushBack(&pNode1,5);
// PushBack(&pNode2,2);
// PushBack(&pNode2,4);
// PushBack(&pNode2,6);
// pRet = MergeOrder_LinkList(pNode1,pNode2);
// Print_LinkList(pRet);
// Destroy(&pRet);
//}
//void test6()
//{
// PNode pNode1 = NULL;
// PNode pNode2 = NULL;
// PNode pRet = NULL;
// PNode tmp1 = NULL;
// PNode tmp2 = NULL;
// int ret = 0;
// Init_LinkList(&pNode1);
// Init_LinkList(&pNode2);
// PushBack(&pNode1,1);
// PushBack(&pNode1,2);
// PushBack(&pNode1,3);
// PushBack(&pNode1,4);
// PushBack(&pNode2,5);
// tmp1 = Find(pNode1,3);
// tmp2 = EndNode(&pNode2);
// tmp2->next = tmp1;
// ret = CheckCross(pNode1,pNode2);
// if(ret == 1)
// printf("两个链表有交点\n");
// else
// printf("两个链表无交点\n");
// pRet = Cross(pNode1,pNode2);
// Print_LinkList(pRet);
// Destroy(&pRet);
//}
int main()
{
//test1();
//test2();
//test3();
test4();
//test5();
//test6();
system("pause");
return 0;
}
程序中用到的其他函数可查: