链表(五)——单向循环链表

1.单向循环链表
区分单向链表和单向循环链表:单向循环链表的尾指针指向头结点。

2.单向循环链表的基本操作

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

#define NULL	0

typedef struct node {
	int data;
	struct node *next;
}ElemSN;


ElemSN * creat_link(int ms); //创建一个单向循环链表
void print_link(ElemSN *head); //输出链表
ElemSN * delete_node(ElemSN *head, int x); //删除结点
ElemSN * clear_link(ElemSN *head); //删除链表

int main()
{
	ElemSN *head;
	int ms, x;

	printf("Please input node number:");
	scanf("%d", &ms);
	head = creat_link(ms); //创建链表
	print_link(head);
	printf("Please input delete node:");
	scanf("%d", &x);
	head = delete_node(head, x); //删除结点
	print_link(head);
	head = clear_link(head); //删除链表
	print_link(head);
}

ElemSN * creat_link(int ms) //带表头的单向链表除了头结点其余结点
                            //创建方法一致,所以不用逆向创建
{
	ElemSN *h = NULL, *p;
	int i, x;
	
	h = (ElemSN *)malloc(sizeof(ElemSN));
	printf("Please input node data:");
	scanf("%d", &x);
	h->data = x;
	h->next = h; //第一个创建完成自己指向自己

	for(i=1; i < ms; i++) //正向创建链表
	{
		p = (ElemSN *)malloc(sizeof(ElemSN));
		printf("Please input node data:");
		scanf("%d", &x);
		p->data = x;
		p->next = h->next; 
		h->next = p;  
		h = h->next;
	}
	h = h->next; //确保h最后指向的是第一个创建的结点,而非最后一个

	return h;
}

void print_link(ElemSN *head)
{
	ElemSN *p;

	if(NULL == head)
	{
		printf("Link is null.\n");
		return;
	}
	p = head;
	do  //使用do-while结构输出
	{
		printf("%d ", p->data);
		p = p->next;
	}while(p != head);
	printf("\n");
}

ElemSN * delete_node(ElemSN *head, int x)
{
	ElemSN *p, *q;
	int flag = 0;

	p = head;
	if(p->next == p) //只有一个结点的情况需要单独处理
	{
		if(p->data == x)
		{
			free(p);
			p = NULL;
			return p;
		}
	}

	do
	{
		if(x == p->next->data) //注意这里用的是p->next->data
		{
			flag = 1;
			break;
		}
		p = p->next;
	}while(p != head);

	if(p->next == head) //删除头结点
	{
		head = head->next;
		free(p->next);
		p->next = head;
		return head;
	}
	
	if(flag)
	{
		q = p->next;
		p->next = q->next;
		free(q);
	}

	return head;
}

ElemSN * clear_link(ElemSN *head)
{
	ElemSN *p, *q;
	
	p = head;
	if(NULL == p)
	{
		return NULL;
	}
	do
	{
		q = p->next;
		free(p);
		p = q;
	}while(p != head);
	head = NULL;

	return head;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值