数据结构3

单向循环链表

1.创建结点

int is_malloc_ok(Clink new_node)
{
	if(NULL == new_node)
	{
		printf("malloc fail!\n");
		return MALLOC_NO;
	}

	else
	{
		return MALLOC_OK;
	}
}

int create_node(Clink *new_node)
{
	*new_node = (Clink) malloc(sizeof(Node));

	if(MALLOC_OK == is_malloc_ok(*new_node))
	{
		return CREATE_OK;
	}

	else
	{
		return CREATE_NO;
	}
}

2.创建一个只有头结点的单向循环链表

void create_clink(Clink *head)
{
	if(CREATE_OK == create_node(head))
	{
		(*head)->next = *head;
	}//创建一个只有头结点的单向循环链表

	else
	{
		return;
	}
}

3.头插

void insert_node_head(Clink head,Clink new_node)
{
	new_node->next = head->next;
	head->next = new_node;
}//头插

4.尾插

void insert_node_tail(Clink head,Clink new_node)
{
	Clink p = NULL;
	p = head;
	while(p->next != head)
	{
		p = p->next;
	}

	p->next = new_node;
	new_node->next = head;//指向头结点的连接断了,重新指向
}//尾插

5.中间前插

void insert_node_mid_before(Clink head,Clink new_node,int num)
{
	Clink p,q = NULL;
	q = head;
	p = head->next;
	while(p != head && p->num != num)
	{
		q = p;
		p = p->next;
	}

	q->next = new_node;
	new_node->next = p;
}//中间前插

6.中间后插

void insert_node_mid_after(Clink head,Clink new_node,int num)
{
	Clink p = NULL;
	p = head->next;
	while(p != head && p->num != num)
	{
		p = p->next;
	}
	
	new_node->next = p->next;
	p->next = new_node;//顺序不能乱
}

7.直插排序

void insert_node_sort(Clink head,Clink new_node)
{
	Clink p,q = NULL;
	q = head;
	p = head->next;
	while(p != head && p->num < new_node->num)
	{
		q = p;
		p = p->next;
	}

	q->next = new_node;
	new_node->next = p;
}

8.数据查找

Clink find_node(Clink head,int num)
{
	Clink p = NULL;
	p = head->next;
	while(p != head && p->num != num)
	{
		p = p->next;
	}

	if(p == head)//注意不是NULL
	{
		return NULL;
	}
	else
	{
		return p;
	}
}

9.数据删除

void delete_node(Clink head,int num)
{
	Clink p,q = NULL;
	q = head;
	p = head->next;
	while(p != head && p->num != num)
	{
		q = p;
		p = p->next;
	}
	
	if(NULL == p)
	{
		printf("no such node\n");
	}
	else
	{
		q->next = p->next;
		free(p);
	}
}

10.链表长度统计

int Length_clink(Clink head)
{
	Clink p = NULL;
	p = head;
	int count = 0;
	while(p->next != head)
	{
		p = p->next;
		count++;
	}
	return count;
}

11.清空链表

void make_empty(Clink head)
{
	Clink p = NULL;
	p = head->next;
	while(p != head)
	{
		head->next = p->next;
		free(p);
		p = head->next;
	}
}//置空链表,保留头结点

12.释放链表

void release_clink(Clink *head)
{
	make_empty(*head);
	free(*head);
	*head = NULL;
	printf("release clink ok!\n");
}//释放链表

13.遍历链表

void display_clink(Clink head)
{
	Clink p = NULL;
	p = head->next;
	while(p != head)
	{
		printf("%d ",p->num);
		p = p->next;
	}

	printf("\n");
}//遍历

14.逆序

void reverse_clink(Clink head)
{
	Clink p,q;
	p = head->next;
	head->next = head;//断开head->next指向,重新指向自己

	while(p != head)
	{
		q = p;
		p = p->next;
		q->next = head->next;
		head->next = q;
	}
}//逆序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值