这里实现的是设定尾指针的循环链表,并带有头节点。
#include <iostream>
#include <cstdio>
#include <malloc.h>
typedef int CElemType;
using namespace std;
typedef struct CNode
{
CElemType data;
struct CNode *next;
}CNode,* CLinkList;
///初始化循环链表,设立尾指针C
bool InitCLinkList_C(CLinkList &C)
{
C=(CLinkList)malloc(sizeof(CNode));
if(!C)
return false;
C->next=C;
return true;
}
///销毁循环链表
void DestroyCLinkList_C(CLinkList &C)
{
if(C)
{
CNode *p=C->next;
while(p!=C)
{
C->next=p->next;
free(p);
p=NULL;
p=C->next;
}
free(C);
C=NULL;
}
}
///清空循环链表
void ClearCLinkList_C(CLinkList &C)
{
if(C&&C->next!=C)
{
CNode *p=C->next;
CNode *q=p->next;
while(q!=C)
{
p->next=q->next;
free(q);
q=NULL;
q=p->next;
}
C=C->next;
C->next=C;
free(q);
q=NULL;
}
}
///查找循环链表中的第i个元素,并用e返回
void GetElem_C(CLinkList C,int i,CElemType &e)
{
if(C&&C->next!=C)
{
CNode *p=C->next->next;
int j=1;
for(;p!=C&&j<i;j++)
p=p->next;
if(j==i)
{
e=p->data;
printf("The element of %dst is e=%d\n",i,e);
}
else
printf("i is not correct!\n");
}
else
printf("The CLinkList is not exist or NULL!\n");
}
///在第i个位置前插入元素e
void InsertCLinkList_C(CLinkList &C,int i,CElemType e)
{
if(C)
{
CNode *p=C->next;
int j=0;
for(;p!=C&&j<i-1;j++)
p=p->next;
if(j==i-1)
{
CNode *s=(CLinkList)malloc(sizeof(CNode));
s->data=e;
s->next=p->next;
p->next=s;
if(p==C)
C=s;
}
}
else
printf("CLinkList is not exist!\n");
}
///删除第i个元素,并用e返回
void DeleteElem_C(CLinkList &C,int i,CElemType &e)
{
if(C&&C->next!=C)
{
CNode *p=C->next;
int j=0;
for(;p!=C&&j<i-1;j++)
p=p->next;
if(j==i-1)
{
CNode *q=p->next;
p->next=q->next;
if(q==C)
C=p;
free(q);
}
else
printf("i is not correct!\n");
}
else
printf("The CLinkList is not exist or NULL!\n");
}
///打印循环链表中的元素
void PrintCLinkList_C(CLinkList C)
{
if(C&&C->next!=C)
{
CNode *p=C->next->next;
while(p!=C)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d\n",C->data);
}
else
{
if(!C)
printf("The CLinkList is not exist!\n");
else
printf("The CLinkList is NULL!\n");
}
}
///合并两个循环链表,合并后的链表为Cb
void MergeCLinkList_C(CLinkList &Ca,CLinkList &Cb)
{
if(Ca&&Cb)
{
CNode *p=Ca->next;
CNode *q=Cb->next;
Ca->next=q->next;
Cb->next=p;
free(q);
}
}
int main()
{
CLinkList Ca,Cb;
CElemType e;
InitCLinkList_C(Ca);
InsertCLinkList_C(Ca,1,5);
InsertCLinkList_C(Ca,2,3);
//DeleteElem_C(Ca,1,e);
//GetElem_C(Ca,1,e);
PrintCLinkList_C(Ca);
// DeleteElem_C(Ca,2,e);
// PrintCLinkList_C(Ca);
//---test Merge---
// InitCLinkList_C(Cb);
// InsertCLinkList_C(Cb,1,8);
// InsertCLinkList_C(Cb,2,9);
// PrintCLinkList_C(Cb);
// MergeCLinkList_C(Ca,Cb);
// PrintCLinkList_C(Cb);
//---test Destroy---
// DestroyCLinkList_C(Ca);
// PrintCLinkList_C(Ca);
//---test Clear---
ClearCLinkList_C(Ca);
PrintCLinkList_C(Ca);
return 0;
}