您的位置:首页 > 其它

单链表的逆置,排序,合并有序链表,不带环相交

2016-09-17 19:34 441 查看
函数实现:

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;
}

程序中用到的其他函数可查

http://blog.csdn.net/snow_5288/article/details/52550765
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐