循环单链表的实现代码

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct snode{
	int data;
	struct snode *next;
}Node,*LinkList;

LinkList Find1(LinkList Tail_node,int k);
LinkList Find2(LinkList Tail_node,int k);

LinkList InitList() 
{
	Node* Tail_node=(Node*)malloc(sizeof(Node));
	if(Tail_node==NULL)
	{
		printf("内存申请失败!\n");
		return NULL; 
	}
	else
	{
		Tail_node->next=Tail_node;
	}
	return Tail_node;
}

//尾插法
void Tail_Insert(LinkList *Tail_node,int e)
{
	Node* new_node=(Node*)malloc(sizeof(Node));
	if(new_node==NULL)
	{
		printf("申请内存失败,即将退出\n");
		return ; 
	}
	else
	{
		new_node->data=e;
		new_node->next=(*Tail_node)->next;
		(*Tail_node)->next=new_node;
	}
	*Tail_node=(*Tail_node)->next; 
}

//头插法 
 void Head_Insert(LinkList *Tail_node,int e)
 {
 	Node* new_node=(Node*)malloc(sizeof(Node));
 	if(new_node==NULL)
 	{
 		printf("申请内存失败,即将退出!\n");
 		return ;
	}
	Node *Head_node=(*Tail_node)->next;//指向尾结点的指针的下一个结点 
	new_node->data=e;
	new_node->next=Head_node->next;
	Head_node->next=new_node;
	//这里需要特判一下,如果链表为空,那么头插入之后要将尾结点的指针向后移一位,指向新结点上 
	if(Head_node==(*Tail_node)) 
	{
		*Tail_node=new_node;
	}
 }
 
 
void Val_Insert(LinkList *Tail_node,int k,int e)
{
	Node* new_node=(Node*)malloc(sizeof(Node));
	if(new_node==NULL)
	{
		printf("申请空间失败,即将退出!\n");
		return ; 
	}
	Node* p=Find1(*Tail_node,k);
	if(p!=NULL)
	{
		new_node->data=e;
		new_node->next=p->next;
		p->next=new_node;
		if(k==(*Tail_node)->data)
		{
			*Tail_node=(*Tail_node)->next;//如果p就是尾结点,那么尾结点的指针要向后移一位 
		}
	}
	else
	{
		printf("未找到结点数据为k的数!\n");
		return ; 
	}
}


LinkList Find1(LinkList Tail_node,int k)
{
	Node* Head_node=Tail_node->next;
	for(Node *i=Head_node->next;i!=Head_node;i=i->next)
	{
		if(i->data==k)
		{
			return i;
		}
	}
	return NULL;	
}


LinkList Find2(LinkList Tail_node,int k)
{
	Node* Head_node=Tail_node->next;
	for(Node *i=Head_node;i->next!=Head_node;i=i->next)
	{
		if(i->next->data==k)
		{
			return i;
		}
	}
	return NULL;	
}


void Delete(LinkList *Tail_node,int e)
{
	Node *p=Find2(*Tail_node,e);
	if(p==NULL)
	{
		printf("没有值为k的结点\n"); 
		return ;
	}
	//注意这里顺序: 
	//先记录一下第二个结点,再释放要删除的结点空间,最后再让第一个结点指向第二个结点 
	//如果要先让第一个结点指向第二个结点,再释放空间,那么要先记录一下要删除的结点 
	Node *q=p->next->next;
	if((*Tail_node)!=p->next)
	{
		free(p->next);
	}
	else
	{
		*Tail_node=p;
		free(p->next);
	}
	p->next=q;
	return ;	
} 

void MK_Empty(LinkList *Tail_node)
{
	if((*Tail_node)->next==*Tail_node)
	{
		printf("空链表\n");
		return ;
	}
	
	Node *Head_node=(*Tail_node)->next;
	Node *Last=Head_node->next;
	Node *Front;
	while(Last!=Head_node)
	{
		Front=Last->next;
		free(Last); 
		Last=Front;
	}
	//删完之后,要将尾指针初始化,使其指向头结点。不然它指的是一块未知区域 
	*Tail_node=Head_node;
	(*Tail_node)->next=*Tail_node;
}

void PrintfList(LinkList Tail_node)
{
	Node *Head_node=Tail_node->next;
	if(Tail_node==Head_node)
	{
		printf("链表为空\n");
		return ;
	}
	for(Node *i=Head_node->next;i!=Head_node;i=i->next)
	{
		printf("%d ",i->data);
	}
	printf("\n");
 } 
 
int main(void)
{
	LinkList Tail_node=InitList();
	Head_Insert(&Tail_node,1);
	PrintfList(Tail_node);
	Head_Insert(&Tail_node,2);
	Head_Insert(&Tail_node,3);
	Head_Insert(&Tail_node,4);
	PrintfList(Tail_node);
	
	Tail_Insert(&Tail_node,5);
	PrintfList(Tail_node);
	
	Val_Insert(&Tail_node,5,6);
	PrintfList(Tail_node);
	
	Delete(&Tail_node,5);
	PrintfList(Tail_node);
	
	MK_Empty(&Tail_node);
	PrintfList(Tail_node);
	
	//验证清空后,尾指针是否初始化成功 
	//若Tail_node和Tail_node->next地址相等,则说明尾指针初始化成功 
	printf("%x %x\n",Tail_node,Tail_node->next);
	return 0; 
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值