数据结构之单循环链表

单循环链表

单链的循环链表结点的存储结构和单链表的存储结构一样,所不同的是:最后一个结点的 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;
}

猜你喜欢

转载自blog.csdn.net/qq_42447402/article/details/86515216
今日推荐