单链表的逆置,排序,合并有序链表,不带环相交
2016-09-17 19:34
441 查看
函数实现:
测试代码:
程序中用到的其他函数可查:
http://blog.csdn.net/snow_5288/article/details/52550765
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
相关文章推荐
- 单链表的所有操作,检查是否有环,合并链表,逆置链表,排序链表......
- 数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!
- 顺序表、单链表、循环单链表、循环双链表、有序单链表的排序的实现
- 二叉树的镜像 (剑指offer)!!!(两个有序链表的合并,链表的逆置)
- 合并两个有序链表/链表反转(逆置)/找链表倒数第k点(遍历一次)
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 单链表(创建,打印,逆序,合并两个有序的链表)
- 合并两个单链表为递减有序的单链表
- 链表的逆置、合并、排序以及插入删除
- 3.两个有序单链表合并为一个有序的单链表
- 【数据结构】单链表(二)单链表的逆置,合并与删除
- 无序链表合并为一个有序链表,且排序后链表中无重复元素
- 单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
- 合并有序单链表并排序(遍历一次)
- 合并两个有序单链表,使得合并后的链表仍然有序
- 【每日算法】归并排序及其应用(逆序对&合并有序链表)
- 反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 合并两个排序的链表使之依然有序(不开辟新空间在原链表上操作的非递归版本)
- 单链表(二):如何实现单链表的排序、逆置(逆序)