单循环链表
单链的循环链表结点的存储结构和单链表的存储结构一样,所不同的是:最后一个结点的 next 域指向头结点,而不是“空”。这样,由表尾很容易找到表头。但若链表较长,则由表头找到表尾较费时,因而,单循环链表往往设立尾指针而不是头指针,这在两个链表首尾相连合并成一个链表时非常方便。
单循环链表的基本操作实现
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//设立尾指针的单循环链表存储结构
typedef struct Node
{
int data; //数据域
struct Node *next; //指针域
}NODE,*PNODE;
//基本操作
void Init(PNODE pEnd);//构造一个空的线性表
PNODE Create1();//创建线性表,插在表尾
PNODE Create2();//创建线性表,插在表头
void Destroy(PNODE *pEnd);//销毁线性表
void Clear(PNODE pEnd);//将线性表置空
bool Empty(PNODE pEnd);//判断线性表是否为空
int Length(PNODE pEnd);//返回线性表的长度
bool Get(PNODE pEnd,int i,int *e);//用e存放第i个元素的值
bool Prior(PNODE pEnd,int cur_e,int *pre_e);//用pre_e存放cur_e元素的前驱元素
bool Next(PNODE pEnd,int cur_e,int *next_e);//用next_e存放cur_e元素的后继元素
bool Insert(PNODE *pEnd,int i,int e);//在第i个位置之前插入元素e
bool Delete(PNODE *pEnd,int i,int *e);//删除第i个位置元素的值,用e保存
void Traverse(PNODE pEnd);//遍历线性表
void MergeList(PNODE *La,PNODE *Lb);//将Lb合并到La的表尾,由La指示新表
int main()
{
int val;
PNODE pEnd=NULL;
pEnd=Create1(pEnd);
printf("遍历元素:");
Traverse(pEnd);
if(Empty(pEnd))
printf("链表为空!\n");
else
printf("链表非空!\n");
printf("链表的长度为:%d\n",Length(pEnd));
if(Get(pEnd,3,&val))
printf("第三个位置的元素为:%d\n",val);
else
printf("第三个位置没有元素\n");
if(Prior(pEnd,4,&val))
printf("元素4的前驱元素是%d\n",val);
else
printf("元素4无前驱元素!\n");
if(Next(pEnd,4,&val))
printf("元素4的后继元素是%d\n",val);
else
printf("元素4无后继元素!\n");
if(Insert(&pEnd,3,100))
printf("插入成功!\n");
else
printf("插入失败\n");
Traverse(pEnd);
if(Delete(&pEnd,4,&val))
printf("删除成功!,删除的元素为%d\n",val);
else
printf("删除失败\n");
Traverse(pEnd);
Destroy(&pEnd);
/* PNODE La,Lb;
La=Create1();
Traverse(La);
Lb=Create1();
Traverse(Lb);
MergeList(&La,&Lb);
Traverse(La);
*/
return 0;
}
void Init(PNODE pEnd)
{
pEnd=(PNODE)malloc(sizeof(NODE));
if(pEnd==NULL)
exit(-1);
pEnd->next=pEnd;
}
PNODE Create1()
{
int val,i;
PNODE pNew,pHead,pEnd;
pEnd=(PNODE)malloc(sizeof(NODE));
if(pEnd==NULL)
exit(-1);
pEnd->next=pEnd;
pHead=pEnd;
printf("输入元素的个数:");
scanf("%d",&val);
for(i=0;i<val;i++)
{
pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
exit(-1);
printf("请输入第%d个元素的值:",i+1);
scanf("%d",&pNew->data);
pEnd->next=pNew;
pEnd=pNew;
pEnd->next=pHead;
}
return pEnd;
}
PNODE Create2()
{
int val,i;
PNODE pNew,pEnd;
pEnd=(PNODE)malloc(sizeof(NODE));
if(pEnd==NULL)
exit(-1);
pEnd->next=pEnd;
printf("请输入元素的个数:");
scanf("%d",&val);
if(val<1)
exit(-1);
pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
exit(-1);
printf("请输入第1个元素的值:");
scanf("%d",&pNew->data);
pEnd->next=pNew;
pNew->next=pEnd;
pEnd=pNew;
for(i=0;i<val-1;i++)
{
pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
exit(-1);
printf("请输入第%d个元素的值:",i+2);
scanf("%d",&pNew->data);
pNew->next=pEnd->next->next;
pEnd->next->next=pNew;
}
return pEnd;
}
void Destroy(PNODE *pEnd)
{
PNODE p=(*pEnd)->next,q;
while(p!=*pEnd)
{
q=p->next;
free(p);
p=q;
}
free(*pEnd);
*pEnd=NULL;
}
void Clear(PNODE pEnd)
{
PNODE p,q;
pEnd=pEnd->next;
p=pEnd->next;
while(p!=pEnd)
{
q=p->next;
free(p);
p=q;
}
pEnd->next=pEnd;
}
bool Empty(PNODE pEnd)
{
if(pEnd->next==pEnd)
return true;
else
return false;
}
int Length(PNODE pEnd)
{
int count=0;
PNODE p=pEnd->next;
while(p!=pEnd)
{
count++;
p=p->next;
}
return count;
}
bool Get(PNODE pEnd,int i,int *e)
{
int j=1;
PNODE p=pEnd->next->next;
while(j<i&&p!=pEnd->next)
{
p=p->next;
j++;
}
if(j>i||pEnd->next==p)
return false;
*e=p->data;
return true;
}
bool Prior(PNODE pEnd,int cur_e,int *pre_e)
{
PNODE p,q;
pEnd=pEnd->next;
p=pEnd->next;
while(p->next!=pEnd)
{
q=p->next;
if(q->data==cur_e)
{
*pre_e=p->data;
return true;
}
p=q;
}
return false;
}
bool Next(PNODE pEnd,int cur_e,int *next_e)
{
PNODE p;
pEnd=pEnd->next;
p=pEnd->next;
while(p->next!=pEnd)
{
if(p->data==cur_e)
{
*next_e=p->next->data;
return true;
}
p=p->next;
}
return false;
}
bool Insert(PNODE *pEnd,int i,int e)
{
int j=1;
PNODE p=(*pEnd)->next,pNew;
if(i<1||i>Length(*pEnd)+1)
return false;
while(j<i)
{
p=p->next;
j++;
}
pNew=(PNODE)malloc(sizeof(NODE));
pNew->data=e;
pNew->next=p->next;
p->next=pNew;
if(p==*pEnd)
*pEnd=pNew;
return true;
}
bool Delete(PNODE *pEnd,int i,int *e)
{
int j=1;
PNODE p=(*pEnd)->next,q;
if(i<1||i>Length(*pEnd))
return false;
while(j<i)
{
p=p->next;
j++;
}
q=p->next;
*e=q->data;
p->next=q->next;
if(*pEnd==q)
*pEnd=p;
free(q);
q=NULL;
return true;
}
void Traverse(PNODE pEnd)
{
PNODE p;
p=pEnd->next->next;
while(p!=pEnd->next)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void MergeList(PNODE *La,PNODE *Lb)
{
PNODE p=(*La)->next,q=(*Lb)->next;
(*La)->next=q->next;
free(q);
(*Lb)->next=p;
*La=*Lb;
}