#define _CRT_SECURE_NO_WARNINGS 1
#include <malloc.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType arr;
struct Node* next;
}Node,*PNode;
void InitLinkList(PNode* pHead);
PNode BuyNode(DataType data);
int SizeLinkList(PNode pHead);
void PrintLinkList(PNode pHead);
void PushBack(PNode* pHead, DataType data);
void PopBack(PNode* pHead);
void PushFront(PNode* pHead, DataType data);
void PopFront(PNode* pHead);
int Find(PNode pHead, DataType data);
PNode Find1(PNode pHead, DataType data);
void Insert(PNode* pHead, int pos, DataType data);
void Erase(PNode* pHead, int pos);
void Erase1(PNode* pHead, PNode pos);
void Remove(PNode* pHead, DataType data);
void RemoveAll(PNode* pHead, DataType data);
void ResversePrintLinkList(PNode pHead);
void DeleteNotTailNode(PNode pos);
void InsertNotHeadNode(PNode pos, DataType data);
PNode JosephCircle(PNode pHead,int m);
PNode FindTailNode(PNode pHead);
PNode ReverseLinkList(PNode pHead);
PNode ReverseLinkList1(PNode pHead);
void BubbleSort(PNode* pHead);
PNode FindMidNode(PNode pHead);
PNode FindLastKNode(PNode pHead, int k);
PNode MergeLinkList(PNode pHead1, PNode pHead2);
int IsCross(PNode pHead1,PNode pHead2);
PNode GetCrossNode(PNode pHead1, PNode pHead2);
PNode HasCircle(PNode pHead);
int GetCircleLen(PNode pMeetNode);
PNode GetEnterNode(PNode pHead,PNode pMeetNode);
int IsCrossWithCircle(PNode pHead1, PNode pHead2);
void UnionSet(PNode* pHead1, PNode* pHead2);
void InitLinkList(PNode* pHead)
{
*pHead=NULL;
}
PNode BuyNode(DataType data)
{
PNode NewNode=(PNode)malloc(sizeof(Node));
NewNode->arr=data;
NewNode->next=NULL;
return NewNode;
}
int SizeLinkList(PNode pHead)
{
int i=0;
if(pHead==NULL)
{
return 0;
}
else
{
while(pHead)
{
i++;
pHead=pHead->next;
}
return i;
}
}
void PrintLinkList(PNode pHead)
{
while(pHead!=NULL)
{
printf("%d->",pHead->arr);
pHead=pHead->next;
}
printf("NULL\n");
}
void PushBack(PNode* pHead, DataType data)
{
assert(pHead);
if (*pHead==NULL)
{
*pHead=BuyNode(data);
}
else
{
PNode CurNode=*pHead;
while(CurNode->next!=NULL)
{
CurNode=CurNode->next;
}
CurNode->next=BuyNode(data);
}
}
void PopBack(PNode* pHead)
{
assert(pHead);
if(*pHead==NULL)
{
printf("该链表为空");
}
else
{
PNode CurNode=*pHead;
PNode PreNode=*pHead;
while(CurNode->next!=NULL)
{
PreNode=CurNode;
CurNode=CurNode->next;
}
PreNode->next=NULL;
}
}
void PushFront(PNode* pHead, DataType data)
{
assert(pHead);
if((*pHead)==NULL)
{
PNode NewNode=BuyNode(data);
(*pHead)=NewNode;
(*pHead)->next=NULL;
}
else
{
PNode NewNode=BuyNode(data);
NewNode->next=(*pHead);
(*pHead)=NewNode;
}
}
void PopFront(PNode* pHead)
{
assert(pHead);
if((*pHead)==NULL)
{
printf("该链表为空");
}
else
{
(*pHead)=(*pHead)->next;
}
}
int Find(PNode pHead, DataType data)
{
PNode p=NULL;
int pos=1;
assert(pHead);
if(pHead==NULL)
{
return 0;
}
else
{
p=pHead;
while(p)
{
if(p->arr!=data)
{
p=p->next;
pos++;
}
else
{
return pos;
}
}
}
printf("没找到\n");
return 0;
}
PNode Find1(PNode pHead, DataType data)
{
PNode pos=NULL;
if(pHead==NULL)
{
return NULL;
}
pos=pHead;
while(pos)
{
if(pos->arr==data)
{
return pos;
}
pos=pos->next;
}
return NULL;
}
void Insert(PNode* pHead,int pos, DataType data)
{
int i=0;
PNode p=BuyNode(data);
assert(pHead);
i=SizeLinkList(*pHead);
if(pos<=i && pos>1)
{
PNode PreNode=NULL;
PNode CurNode=*pHead;
while(pos-1)
{
PreNode=CurNode;
CurNode=CurNode->next;
pos--;
}
p->next=CurNode;
PreNode->next=p;
}
else if(pos==1)
{
p->next=(*pHead);
*pHead=p;
}
else
{
printf("插入结点位置不合理\n");
}
}
void Erase(PNode* pHead,int pos)
{
int i=0;
i=SizeLinkList(*pHead);
assert(pHead);
if((*pHead)==NULL)
{
printf("该链表为空");
}
else
{
if(pos<=i && pos>1)
{
PNode PreNode=NULL;
PNode CurNode=*pHead;
while(pos-1)
{
PreNode=CurNode;
CurNode=CurNode->next;
pos--;
}
PreNode->next=CurNode->next;
}
else if(pos==1)
{
*pHead=(*pHead)->next;
}
else
{
printf("删除结点位置不合理\n");
}
}
}
void Erase1(PNode* pHead, PNode pos)
{
PNode PreNode=NULL;
PNode CurNode=(*pHead);
assert(pHead);
if((*pHead)==NULL)
{
printf("该链表为空");
}
while(CurNode)
{
PreNode=CurNode;
CurNode=CurNode->next;
if(CurNode==pos)
{
PreNode->next=CurNode->next;
}
}
}
void Remove(PNode* pHead, DataType data)
{
assert(pHead);
if((*pHead)==NULL)
{
printf("该链表为空");
}
else
{
PNode PreNode=NULL;
PNode CurNode=(*pHead);
while(CurNode->next!=NULL)
{
PreNode=CurNode;
CurNode=CurNode->next;
if(CurNode->arr==data)
{
PreNode->next=CurNode->next;
}
}
}
}
void RemoveAll(PNode* pHead, DataType data)
{
int count=0;
assert(pHead);
if((*pHead)==NULL)
{
printf("该链表为空");
}
else
{
PNode CurNode=(*pHead);
while(CurNode->next!=NULL)
{
if((CurNode->arr)==data)
{
count++;
}
CurNode=CurNode->next;
}
}
while(count)
{
Remove(pHead,data);
count--;
}
}
void ResversePrintLinkList(PNode pHead)
{
if(pHead!=NULL)
{
ResversePrintLinkList(pHead->next);
printf("%d->",pHead->arr);
}
}
void DeleteNotTailNode(PNode pos)
{
PNode DelNode=NULL;
if(pos==NULL || pos->next==NULL)
{
return;
}
DelNode=pos->next;
pos->arr=DelNode->arr;
pos->next=DelNode->next;
free(DelNode);
}
void InsertNotHeadNode(PNode pos,DataType data)
{
PNode NewNode=BuyNode(data);
if(pos==NULL)
{
return;
}
NewNode->next=pos->next;
pos->next=NewNode;
NewNode->arr=pos->arr;
pos->arr=data;
}
PNode FindTailNode(PNode pHead)
{
if(pHead==NULL)
{
return NULL;
}
while(pHead->next)
{
pHead=pHead->next;
}
return pHead;
}
PNode JosephCircle(PNode pHead,int m)
{
PNode pos=NULL;
PNode PreNode=NULL;
int count=0;
if(pHead==NULL || m<=0)
{
return NULL;
}
else
{
pos=pHead;
while(pos->next!=pos)
{
count=m;
while(--count)
{
PreNode=pos;
pos=pos->next;
}
PreNode->next=pos->next;
}
return pos;
}
}
PNode ReverseLinkList(PNode pHead)
{
PNode PreNode=pHead;
PNode Node=PreNode->next;
PNode NextNode=Node->next;
if(pHead==NULL || pHead->next==NULL)
{
return pHead;
}
while(NextNode!=NULL)
{
Node->next=PreNode;
PreNode=Node;
Node=NextNode;
NextNode=NextNode->next;
}
pHead->next=NULL;
Node->next=PreNode;
return Node;
}
PNode ReverseLinkList1(PNode pHead)
{
PNode pNewHead=NULL;
PNode CurNode=pHead;
PNode NextNode=CurNode->next;
if(pHead==NULL || pHead->next==NULL)
{
return pHead;
}
while(NextNode)
{
CurNode->next=pNewHead;
pNewHead=CurNode;
CurNode=NextNode;
NextNode=NextNode->next;
}
CurNode->next=pNewHead;
pNewHead=CurNode;
return pNewHead;
}
void BubbleSort(PNode* pHead)
{
PNode Node=*pHead;
PNode pos=*pHead;
PNode TailNode=NULL;
if((*pHead)==NULL || (*pHead)->next==NULL)
{
return;
}
while(Node->next)
{
while(pos->next!=TailNode)
{
if(pos->arr>pos->next->arr)
{
DataType temp=pos->arr;
pos->arr=pos->next->arr;
pos->next->arr=temp;
}
pos=pos->next;
}
TailNode=pos;
pos=*pHead;
Node=Node->next;
}
}
PNode FindMidNode(PNode pHead)
{
PNode SlowNode=pHead;
PNode FastNode=pHead;
if(pHead==NULL)
{
printf("该链表为空");
}
while(FastNode && FastNode->next)
{
FastNode=FastNode->next->next;
SlowNode=SlowNode->next;
}
return SlowNode;
}
PNode FindLastKNode(PNode pHead,int k)
{
PNode SlowNode=pHead;
PNode FastNode=pHead;
if(pHead==NULL || k<=0)
{
return NULL;
}
while(k--)
{
FastNode=FastNode->next;
}
while(FastNode)
{
FastNode=FastNode->next;
SlowNode=SlowNode->next;
}
return SlowNode;
}
PNode MergeLinkList(PNode pHead1,PNode pHead2)
{
PNode pL1=pHead1;
PNode pL2=pHead2;
PNode NewNode=NULL;
PNode TailNode=NULL;
if(pHead1==NULL)
{
return pHead2;
}
if(pHead2==NULL)
{
return pHead1;
}
if(pL1->arr<=pL2->arr)
{
NewNode=pL1;
TailNode=pL1;
pL1=pL1->next;
}
else
{
NewNode=pL2;
TailNode=pL2;
pL2=pL2->next;
}
while(pL1 && pL2)
{
if(pL1->arr<=pL2->arr)
{
TailNode->next=pL1;
pL1=pL1->next;
}
else
{
TailNode->next=pL2;
pL2=pL2->next;
}
TailNode=TailNode->next;
}
if(pL1==NULL)
{
TailNode->next=pL2;
}
if(pL2==NULL)
{
TailNode->next=pL1;
}
return NewNode;
}
int IsCross(PNode pHead1,PNode pHead2)
{
PNode pL1=pHead1;
PNode pL2=pHead2;
if(pL1==NULL || pL2==NULL)
{
return 0;
}
if(pL1 && pL2)
{
while(pL1)
{
pL1=pL1->next;
}
while(pL2)
{
pL2=pL2->next;
}
if(pL1==pL2)
{
return 1;
}
}
return 0;
}
PNode GetCrossNode(PNode pHead1,PNode pHead2)
{
PNode pL1=pHead1;
PNode pL2=pHead2;
int size=0;
int size1=0;
int size2=0;
if(pL1==NULL || pL2==NULL)
{
return NULL;
}
if(IsCross(pHead1,pHead2)==1)
{
size1=SizeLinkList(pHead1);
size2=SizeLinkList(pHead2);
size=size1-size2;
if(size>0)
{
while(size--)
{
pL1=pL1->next;
}
pL1=pL1->next;
pL2=pL2->next;
if(pL1==pL2)
{
return pL1;
}
}
else
{
size=0-size;
while(size--)
{
pL2=pL2->next;
}
pL1=pL1->next;
pL2=pL2->next;
if(pL1==pL2)
{
return pL1;
}
}
}
return NULL;
}
PNode HasCircle(PNode pHead)
{
PNode FastNode=pHead;
PNode SlowNode=pHead;
if(pHead==NULL)
{
return NULL;
}
while(FastNode && FastNode->next)
{
FastNode=FastNode->next->next;
SlowNode=SlowNode->next;
if(FastNode==SlowNode)
{
return FastNode;
}
}
return NULL;
}
int GetCircleLen(PNode pMeetNode)
{
PNode CurNode=pMeetNode;
int count=1;
if(pMeetNode==NULL)
{
return 0;
}
while(pMeetNode!=CurNode->next)
{
CurNode=CurNode->next;
count++;
}
return count;
}
PNode GetEnterNode(PNode pHead,PNode pMeetNode)
{
PNode pH=pHead;
PNode pM=pMeetNode;
if (pHead==NULL || pMeetNode==NULL)
{
return NULL;
}
while(pH!=pM)
{
pH=pH->next;
pM=pM->next;
}
return pH;
}

int IsCrossWithCircle(PNode pHead1,PNode pHead2)
{
PNode pM1=HasCircle(pHead1);
PNode pM2=HasCircle(pHead2);
if(NULL==pM1 || NULL==pM2)
{
return 0;
}
if(NULL==pM1 && NULL==pM2)
{
int k=0;
return k=IsCross(pHead1,pHead2);
}
if(NULL!=pM1 && NULL!=pM2)
{
PNode CurNode=pM1;
while(CurNode->next!=pM1)
{
if(pM2==CurNode)
{
return 1;
}
CurNode=CurNode->next;
}
if(pM2==CurNode)
{
return 1;
}
}
return 0;
}

void UnionSet(PNode* pHead1, PNode* pHead2)
{
PNode pL1=*pHead1;
PNode pL2=*pHead2;
assert(pHead1);
assert(pHead2);
if(NULL==(*pHead1)||NULL==(*pHead2))
{
printf("无相同元素");
}
else
{
while(pL1 && pL2)
{
if(pL1->arr>pL2->arr)
{
pL2=pL2->next;
}
else if(pL1->arr<pL2->arr)
{
pL1=pL1->next;
}
else
{
printf("%d\n",pL1->arr);
if(pL1->arr==pL1->next->arr && pL2->arr==pL2->next->arr)
{
pL1=pL1->next;
pL2=pL2->next;
}
pL1=pL1->next;
pL2=pL2->next;
}
}
}
}
void fun()
{
PNode pHead=NULL;
PNode pHead1=NULL;
PNode pHead2=NULL;
PNode pos=NULL;
PNode pos1=NULL;
PNode TailNode=NULL;
PNode TailNode1=NULL;
PNode EnterNode=NULL;
int i=0;
int j=0;
PushFront(&pHead1,7);
PushFront(&pHead1,6);
PushFront(&pHead1,5);
PushFront(&pHead1,5);
PushFront(&pHead1,3);
PushFront(&pHead1,2);
PrintLinkList(pHead1);
PushFront(&pHead2,9);
PushFront(&pHead2,6);
PushFront(&pHead2,5);
PushFront(&pHead2,5);
PushFront(&pHead2,1);
PrintLinkList(pHead2);
UnionSet(&pHead1,&pHead2);
}
int main()
{
fun();
system("pause");
return 0;
}