无头单链表的所有操作(包含面试题)

来源:互联网 发布:突变体软件 编辑:程序博客网 时间:2024/05/16 14:36
#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);         //找到data返回data
PNode Find1(PNode pHead, DataType data);      //找到data返回该结点的地址
void Insert(PNode* pHead,int pos, DataType data);      //在pos的位置插入data
void Erase(PNode* pHead, int pos);           //删除pos位置的结点(pos为第几个元素)
void Erase1(PNode* pHead, PNode pos);       //删除pos位置的结点(pos为指针即地址)
void Remove(PNode* pHead, DataType data);    //移除data
void RemoveAll(PNode* pHead, DataType data);    //移除链表中所有的data
void ResversePrintLinkList(PNode pHead);       //逆序打印链表
void DeleteNotTailNode(PNode pos);           // 删除不是尾结点的结点
void InsertNotHeadNode(PNode pos,DataType data);     // 在不是第一个结点的位置插入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);     //找倒数第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;
}
}
}
}
1 0