循环链表的算法实现

循环链表

循环链表的示意图:
循环链表的算法实现_第1张图片

1.循环链表结构体的定义

typedef struct _LinkNode{
     
	int data;		//结点的数据域
	struct _LinkNode *next;//结点的指针域
}LinkNode,LinkList;//LinkList为指针结构体LNode的指针类型

2.循环链表的初始化

bool InitList(LinkList *&L)//构建一个空的链表L
{
     
	L=new LinkNode;//生成新节点作为头结点
	if(!L)return false;//生成结点失败

	L->next=L;//头结点的指针域指向自己
	L->data=-1;
	return true;
}

3.循环链表插入结点

bool ListInsert_back(LinkList *&L,LinkNode * node){
     
	LinkNode *last = NULL;

	if(!L||!node) return false;

	//找到最后一个结点
	last = L;
	while(last->next!=L)last = last->next;

	//新的结点连接到最尾部
	node->next=L;
	last->next=node;
	return true;
}

4.依次循环,报道为n数字(n有自己定义)的退出

bool J(LinkList *&L,int interval){
     
	//在带头结点的循环链表L中,每个interval间隔循环删除结点
	LinkList *p,*q;
	int j=0,i=0;
	int times = 0,num = 0;
	p=L;
	if(!L||p->next==L){
     
		cout<<"链表为空!"<<endl;
		return false;
	}
	
	if(interval<1){
     
		cout<<"报数淘汰口令不能小于1!"<<endl;
		return false;
	}

	do{
     
		i+=interval;
		while((p->next))//查找第i个结点,p指向该节点的上一个结点
		{
     
			if(p->next!=L)j++;
			if(j>=i)break;
			p=p->next;
		}
		times++;
		q=p->next;//临时保存被删除结点的地址以备释放看空间
		num=q->data;
		if(times==5)cout<<"第5个出圈的编号是: "<<num<<endl;
		cout<<"cur: "<<q->data<<"last: "<<p->data<<"next: "<<q->next->data<<endl;
		p->next=q->next;//改变删除结点前驱结点的指针域

		delete q;//释放被删除结点的空间
		LinkPrint(L);
	}while(L->next!=L);//链表不为空,继续报数
	cout<<"最后一个出圈的编号是: "<<num<<endl;
	return true;
}

4.循环链表的遍历

void LinkPrint(LinkList *L)//循环链表的输出
{
     
	LinkList *p;

	if(!L||L==L->next){
     
		cout<<"链表为空!"<<endl;
		return ;
	}
	p=L->next;
	while(p!=L){
     
		cout<<p->data<<"\t";
		p=p->next;
	}
	cout<<endl;
}

5.main函数

int main(){
     
	int i,x;
	LinkList *L;
	LinkNode *s;

	//1.初始化一个空的循环链表
	if(InitList(L)){
     
		cout<<"初始化一个空的循环链表!"<<endl;
	}

	i=0;

	while((++i)<=10){
     
		s=new LinkNode;//生成新节点
		s->data=i;//输入元素值赋给新结点的数据域
		s->next=NULL;
		if(ListInsert_back(L,s)){
     
			cout<<"插入成功!"<<endl;
		}else{
     
			cout<<"插入失败!"<<endl;
		}
	}


	cout<<"尾插发创建循环链表输出结果: "<<endl;
	LinkPrint(L);

	//3.解问题
	J(L,9);

	system("pause");
	return 0;
}

效果图的实现
循环链表的算法实现_第2张图片

源码:

#include 
#include 
#include 

using namespace std;

typedef struct _LinkNode{
     
	int data;		//结点的数据域
	struct _LinkNode *next;//结点的指针域
}LinkNode,LinkList;//LinkList为指针结构体LNode的指针类型

void LinkPrint(LinkList *L);

bool InitList(LinkList *&L)//构建一个空的链表L
{
     
	L=new LinkNode;//生成新节点作为头结点
	if(!L)return false;//生成结点失败

	L->next=L;//头结点的指针域指向自己
	L->data=-1;
	return true;
}

//尾插发,插入元素
bool LinsInsert_back0(LinkList *&L,int e){
     
	LinkNode *last=NULL;
	LinkNode *s;
	if(!L)return false; 
	last=L;
	while(last->next)last=last->next;
	s=new LinkNode;
	s->data=e;
	s->next=NULL;
	last->next=s;
	return true;
}

//尾插发插入节点
bool ListInsert_back(LinkList *&L,LinkNode * node){
     
	LinkNode *last = NULL;

	if(!L||!node) return false;

	//找到最后一个结点
	last = L;
	while(last->next!=L)last = last->next;

	//新的结点连接到最尾部
	node->next=L;
	last->next=node;
	return true;
}

bool J(LinkList *&L,int interval){
     
	//在带头结点的循环链表L中,每个interval间隔循环删除结点
	LinkList *p,*q;
	int j=0,i=0;
	int times = 0,num = 0;
	p=L;
	if(!L||p->next==L){
     
		cout<<"链表为空!"<<endl;
		return false;
	}
	
	if(interval<1){
     
		cout<<"报数淘汰口令不能小于1!"<<endl;
		return false;
	}

	do{
     
		i+=interval;
		while((p->next))//查找第i个结点,p指向该节点的上一个结点
		{
     
			if(p->next!=L)j++;
			if(j>=i)break;
			p=p->next;
		}
		times++;
		q=p->next;//临时保存被删除结点的地址以备释放看空间
		num=q->data;
		if(times==5)cout<<"第5个出圈的编号是: "<<num<<endl;
		cout<<"cur: "<<q->data<<"last: "<<p->data<<"next: "<<q->next->data<<endl;
		p->next=q->next;//改变删除结点前驱结点的指针域

		delete q;//释放被删除结点的空间
		LinkPrint(L);
	}while(L->next!=L);//链表不为空,继续报数
	cout<<"最后一个出圈的编号是: "<<num<<endl;
	return true;
}

void LinkPrint(LinkList *L)//循环链表的输出
{
     
	LinkList *p;

	if(!L||L==L->next){
     
		cout<<"链表为空!"<<endl;
		return ;
	}
	p=L->next;
	while(p!=L){
     
		cout<<p->data<<"\t";
		p=p->next;
	}
	cout<<endl;
}

int main(){
     
	int i,x;
	LinkList *L;
	LinkNode *s;

	//1.初始化一个空的循环链表
	if(InitList(L)){
     
		cout<<"初始化一个空的循环链表!"<<endl;
	}

	i=0;

	while((++i)<=10){
     
		s=new LinkNode;//生成新节点
		s->data=i;//输入元素值赋给新结点的数据域
		s->next=NULL;
		if(ListInsert_back(L,s)){
     
			cout<<"插入成功!"<<endl;
		}else{
     
			cout<<"插入失败!"<<endl;
		}
	}


	cout<<"尾插发创建循环链表输出结果: "<<endl;
	LinkPrint(L);

	//3.解问题
	J(L,9);

	system("pause");
	return 0;
}

你可能感兴趣的:(数据结构,技术分享,笔记,指针,链表,数据结构,算法)