Linklits.h
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* next;
}Node,*pNode,*pList;
void InitLinkList(pList* pplist)//链表初始化
pNode newNode(DataType data)//创建新节点
void PushBack(pList* pplist,DataType data)//尾插
void Popback(pList* pplist)//尾删
void PushFront(pList* pplist,DataType data)//头插
void PopFront(pList* pplist)//头删
pNode Find(pList plist,DataType data)//查找某元素的节点
void EraseNotTail(pNode pos)//删出无头节点的非尾节点
void InserFrontNode(pNode pos,DataType data)//无头链表的的非头节点插入一个元素
void ReversePrint(pList plist)//逆序打印单链表
void ErasekNode(pList plist,int k)//删除倒数第K个节点(要求只遍历一边)
void BubbleSort(pList* pplist)//冒泡排序
pList Meger(pList pplist1,pList pplist2)//合并两个有序的链表,合并后依然有序。(递归实现)
pNode CheckCircle(pList plist)//检查是否带环
int GetCirclelength(pNode meet)//求环的长度
pNode GetCircleEntry(pList plist,pNode meet)//求环的入口点
int CheckCross(pList plist1,pList plist2)//判断两个链表是否相交
pNode CrossNode(pList plist1,pList plist2)//求交点
#include<iostream>
#include<assert.h>
using namespace std;
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* next;
}Node,*pNode,*pList;
void InitLinkList(pList* pplist)//链表初始化
{
assert(pplist);
*pplist=NULL;
}
pNode newNode(DataType data)//创建新节点
{
pNode pnode=(Node*)malloc(sizeof(Node));
if(pnode==NULL)
{
perror("Pushbac()::malloc()");//内存分配失败
exit(1);
}
pnode->_data=data;
pnode->next=NULL;
}
void PushBack(pList* pplist,DataType data)//尾插
{
pNode pnode=NULL;
assert(pplist);
pnode=newNode(data);
if(*pplist==NULL)
{
*pplist=pnode;
}
else
{
pNode cur=*pplist;
while(cur->next!=NULL)
{
cur=cur->next;
}
cur->next=pnode;
}
}
void Popback(pList* pplist)//尾删
{
assert(pplist);
if(*pplist==NULL)
{
return ;
}
else if((*pplist)->next!=NULL)
{
free(*pplist);
*pplist=NULL;
}
else
{
pNode cur=*pplist;
pNode pre=NULL;
while(cur->next!=NULL)
{
pre=cur;
cur=cur->next;
}
pre->next=NULL;
free(cur);
}
}
void PushFront(pList* pplist,DataType data)//头插
{
pNode pnode=NULL;
assert(pplist);
pnode=newNode(data);
if(*pplist==NULL)
{
*pplist=pnode;
}
else
{
pnode->next=*pplist;
*pplist=pnode;
}
}
void PopFront(pList* pplist)//头删
{
assert(pplist);
if(*pplist=NULL)
{
return ;
}
else if((*pplist)->next=NULL)
{
free(*pplist);
*pplist=NULL;
}
else
{
pNode cur=*pplist;
*pplist=(*pplist)->next;
free(cur);
cur=NULL;
}
}
pNode Find(pList plist,DataType data)//查找某元素的节点
{
pNode cur=plist;
if(plist==NULL)
{
return ;
}
else
{
while(cur)
{
if(cur->_data==data)
{
return cur;
}
else
{
cur=cur->next;
}
}
return NULL;
}
}
void EraseNotTail(pNode pos)//删出无头节点的非尾节点
{
pNode cur=NULL;
if(pos==NULL)
{
return ;
}
else
{
pos->_data=pos->next->_data;
cur=pos->next;
pos->next=cur->next;
free(cur);
}
}
void InserFrontNode(pNode pos,DataType data)//无头链表的的非头节点插入一个元素
{
DataType tmp=0;
pNode pnode=NULL;
pnode=newNode(data);
if(pos==NULL)
{
return ;
}
else
{
pnode->next=pos->next;
pos->next=pnode;
tmp=pos->_data;
pos->_data=pnode->_data;
pnode->_data=tmp;
}
}
void ReversePrint(pList plist)//逆序打印单链表
{
pNode cur=plist;
if(plist==NULL)
{
return ;
}
if(cur->next!=NULL)
{
ReversePrint(cur->next);
}
printf("%d ",cur->_data);
}
void ErasekNode(pList plist,int k)//删除倒数第K个节点(要求只遍历一边)
{
pNode fast=plist;
pNode slow=plist;
pNode cur=NULL;
while(fast!=NULL&&fast->next!=NULL)
{
if(--k<=0)
{
cur=slow;
slow=slow->next;
}
fast=fast->next;
}
if(slow==plist)
{
cur=plist;
plist=plist->next;
free(cur);
}
else if(k<=0)
{
cur->next=slow->next;
free(slow);
}
if(k>1)
{
return ;
}
}
void BubbleSort(pList* pplist)//冒泡排序
{
assert(pplist);
pNode cur=NULL;
pNode tail=NULL;
assert(pplist);
if(*pplist==NULL&&(*pplist)->next==NULL)
{
return ;
}
else
{
while(tail!=(*pplist)->next)
{
cur=*pplist;
while(cur!=tail&&cur->next!=tail)
{
if(cur->_data>cur->next->_data)
{
DataType tmp=cur->_data;
cur->_data=cur->next->_data;
cur->next->_data=tmp;
}
cur=cur->next;
}
tail=cur;
}
}
}
pList Meger(pList pplist1,pList pplist2)//合并两个有序的链表,合并后依然有序。(递归实现)
{
pList pplist=NULL;
if(pplist1==NULL)
{
return pplist2;
}
if(pplist2==NULL)
{
return pplist1;
}
else
{
if(pplist1->_data>pplist2->_data)
{
pplist=pplist2;
pplist->next=Meger(pplist1,pplist2->next);
}
else
{
pplist=pplist1;
pplist->next=Meger(pplist1->next,pplist2);
}
}
return pplist;
}
pNode CheckCircle(pList plist)//检查是否带环
{
pNode fast=plist;
pNode slow=plist;
while(fast!=NULL&&fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
return fast;
}
return NULL;
}
int GetCirclelength(pNode meet)//求环的长度
{
int i=1;
pNode cur=meet->next;
while(cur!=meet)
{
cur=cur->next;
i++;
}
return i;
}
pNode GetCircleEntry(pList plist,pNode meet)//求环的入口点
{
pNode pnode=plist;
if(pnode==NULL&&meet==NULL)
{
return NULL;
}
while(pnode!=meet)
{
pnode=pnode->next;
meet=meet->next;
}
return meet;
}
int CheckCross(pList plist1,pList plist2)//判断两个链表是否相交
{
pNode p1=plist1;
pNode p2=plist2;
while(p1&&p1->next)
{
p1=p1->next;
}
while(p2&&p2->next)
{
p2=p2->next;
}
if((p1==p2)&&(p1!=NULL))
return 1;
else
return -1;
}
pNode CrossNode(pList plist1,pList plist2)//求交点
{
pList p1=plist1;
pList p2=plist2;
int len1=1;
int len2=1;
int ret=CheckCross(plist1,plist2);
if(ret==-1)
{
return NULL;
}
else{
while(p1->next)
{
p1=p1->next;
len1++;
}
while(p2->next)
{
p2=p2->next;
len2++;
}
int len=0;
if(len1>len2)
{
len=len1-len2;
p1=plist1;
p2=plist2;
while(p1&&p1->next)
{
if(--len<=0)
{
p2=p2->next;
}
p1=p1->next;
}
return p2;
}
else
{
len=len2-len1;
p1=plist1;
p2=plist2;
while(p2&&p2->next)
{
if(--len<=0)
{
p1=p1->next;
}
p2=p2->next;
}
return p1;
}
}
}