【数据结构】循环单链表的实现(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/82902984

 循环单链表应掌握以下基本操作:

1、建立一个空的循环单链表。

2、获得循环单链表的最后一个结点的位置。

3、输出循环单链表中各结点的值。

4、在循环单链表中查找值为x的结点。

5、在循环单链表中第i个结点后插入值为x的新结点。

6、在循环单链表中删除值为x 的结点。

以下是头文件:(可以有选择的看,有很多算法)

#ifndef CIRCLE_HEAD_LINK_H_INCLUDED
#define CIRCLE_HEAD_LINK_H_INCLUDED
#include <stdio.h> 
#include <stdlib.h>
typedef int datatype;
typedef struct circle_link
{
	datatype info;
	struct circle_link *next;
}N;
	
/*创建一个空链表*/
N *init()
{
	return NULL;
} 
	
/*创建一个循环单链表*/
N *creat(N *head)
{
	printf("以输入-1为结束\n"); 
	int x;
	N *p,*q,*h=head;
	scanf("%d",&x);
	while(x!=-1)
	{
		p=(N*)malloc(sizeof(N));
		p->info=x;
		p->next=NULL; 
		if(!h)
		{	
			q=p;
			h=p;
		}
		else
		{
			q->next=p;
			q=p;
		}
		scanf("%d",&x);
	}
	p->next=h;
	printf("\n创建完成\n"); 
	return h;
} 

/*打印循环单链表*/
void display(N *head)
{
	N *p=head;
	/*打印第一个结点之后在进入循环*/
	if(!head)
	{
		printf("该循环单链表是空的\n");
	}
	else
	{
		printf("%d  ",p->info);
		p=p->next;
		while(p!=head)
		{
			printf("%d  ",p->info);
			p=p->next;
		}
	}
	printf("%d  ",p->info);
	printf("\n打印完成\n");
} 

/*获得循环单链表最后一个结点的位置*/
N *rear(N* head)
{
	N *p=head;
	if(!head)
	{
		return NULL;
	}
	else
	{
		while(p->next!=head)
		{
			p=p->next;
		}
		return p;
	}
} 

/*在循环单链表中查找值为x的结点*/
N* find(N* head,int x)
{
	N *p=head,*q;
	if(!head)
	{
		printf("该循环单链表为空\n");
		return NULL; 
	}
	while(p->next!=head && p->info!=x)
	{
		p=p->next;
	}
	if(p->info==x)
	{
		return p;
	}
	else
	{
		return NULL;
	}
} 

/*在循环单链表中第i个结点后插入一个值为x的结点*/
N *insert(N *head,int x,int i)
{
	N *p,*q,*myrear;
	int j;
	p=(N*)malloc(sizeof(N));
	p->info=x;
	if(i<0)
	{
		printf("无法找到指定的插入位置\n");
		free(p);
		return head; 	
	} 
	else if(i==0 && !head)
	{
		p->next=p;
		head=p;
		return head;
	}
	else if(i==0 && head)
	{
		myrear=rear(head);/*找到循环单链表中的最后一个结点*/
		p->next=head;
		myrear->next=p;
		head=p;
		return head; 
	}
	else if(i>0 && !head)
	{
		printf("该列表是空列表,无法找到插入位置\n");
		free(p);
		return head;
	}
	else if(i>0 && head)
	{
		q=head;
		j=1;
		while(i!=j && q->next!=head)
		{
			q=q->next;j++;
		}
		if(i!=j)
		{
			printf("表中不存在第%d个结点,无法进行插入",j);
			free(p);
			return head; 
		}
		else
		{
			p->next=q->next;
			q->next=p;
			return head;
		}
	}
} 

/*在循环单链表中删除一个值为x的结点*/
N *dele(N *head,int x)
{
	N *pre,*q;
	if(!head)
	{
		printf("\n该链表为空,无法进行删除操作");
		return head;
	} 
	else
	{
		q=head;
		while(q->next!=head && q->info!=x)
		{
			pre=q;
			q=q->next;
		}
		if(q->info!=x)
		{
			printf("没有找到值为%d的结点\n",x);
		}
		else
		{
			if(q!=head)
			{
				pre->next=q->next;free(q);
			}
			else
			{
				if(head->next==head)/*该循环单链表中只有一个结点*/
				{
					free(q);
					head=NULL;
				}
				else/*删除第一个结点*/ 
				{
					pre=rear(head);
					pre->next=head->next;
					head=head->next;
					free(q);
				}
			}
		}
	}
	return head;
} 

/*单链表的打印*/ 
void display_dan(N *head)
{
	N *p=head;
	if(!head)
	{
		printf("该单链表是空的\n");
	}
	else
	{
		while(p)
		{
			printf("%d  ",p->info);
			p=p->next;
		}	
	}
}

/*创建一个循环单链表*/
N *creat_dan(N *head)
{
	N *p,*q;
	int x;
	printf("以输入-1表示结束\n");
	scanf("%d",&x);
	while(x!=-1)
	{
		p=(N*)malloc(sizeof(N));
		p->info=x;
		p->next=NULL;
		if(!head)
		{
			head=p;
			q=p;
		}
		else
		{
			q->next=p;
			q=p;
		}
		scanf("%d",&x);
	}
	return head;
} 

/*单链表找最后一个结点*/
N *rear_dan(N *head)
{
	N *p=head;
	if(!head)
	{
		printf("该链表为空\n");
		return head;
	}
	else
	{
		while(p->next)
		{
			p=p->next; 
		}
		return p;
	}
} 
#endif // CIRCLE_HEAD_LINK_H_INCLUDED

下面是主程序:

#include "stdio.h"
#include "circle_head_link.h"
int main()
{
	int x,i;
	N *h,*h1,*h2,*rear_1,*rear_2;
	while(1)
	{
		printf("\n已对一个循环单链表进行初始化\n");
		h=init();
		
		printf("创建一个循环单链表\n");
		h=creat(h);
		
		printf("查找一个值为x的结点\n");
		scanf("%d",&x);
		if(find(h,x)) 
		{
			printf("%d",(find(h,x)->info));
		}
		else
		{
			printf("不存在info域为该值的结点!\n");
		}
		
		printf("\n在第i个结点后插入值为x的结点,下面请输入i和x\n");
		scanf("%d%d",&i,&x);
		h=insert(h,x,i);
		display(h);
		
		printf("\n删除循环单链表中值为x的结点,下面请输入x\n");
		scanf("%d",&x);
		h=dele(h,x);
		display(h);
		
		printf("\n重新创建两个单链表,并将两个单链表变成一个循环单链表\n");
		printf("第一个单链表\n");
		h1=init();
		h1=creat_dan(h1);
		display_dan(h1);
		rear_1=rear_dan(h1);
		printf("\n第二个单链表\n");
		h2=init();
		h2=creat_dan(h2);
		display_dan(h2);
		printf("\n合成以后\n"); 
		rear_2=rear_dan(h2);
		rear_1->next=h2;
		rear_2->next=h1;
		display(h1);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/82902984