循环链表

循环链表 和之前的链表原理一样

头文件:

#ifndef __CIRCLELIST_H__
#define __CIRCLELIST_H__


#include "stdio.h"
#include "stdlib.h"

typedef void CircleList;

typedef struct _tag_CircleListNode
{
	struct _tag_CircleListNode * next;
}CircleListNode;

CircleList* CircleList_Create();//创建链表

void CircleList_Destroy(CircleList* list);//析构链表

void CircleList_Clear(CircleList* list);//清空链表

int CircleList_Length(CircleList* list);//求链表长度

int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);//插入

CircleListNode* CircleList_Get(CircleList* list, int pos);//获取链表中元素

CircleListNode* CircleList_Delete(CircleList* list, int pos);//删除节点

//add

CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);

CircleListNode* CircleList_Reset(CircleList* list);

CircleListNode* CircleList_Current(CircleList* list);

CircleListNode* CircleList_Next(CircleList* list);

#endif

函数实现:

#include "circlelist.h"
typedef struct TCircleList
{
	CircleListNode header;
	CircleListNode  *slider;
	int length;
}TCircleList;
CircleList* CircleList_Create()
{
	TCircleList *list = NULL;
	list = (TCircleList *)malloc(sizeof(TCircleList));
	if (list == NULL)
	{
		return NULL;
	}
	list->length = 0;
	list->header.next = NULL;
	list->slider = NULL;
	return (CircleList*)list;
}

void CircleList_Destroy(CircleList* list)
{
	TCircleList *tlist = NULL;
	tlist = (TCircleList *)list;
	if (tlist == NULL)
	{
		return ;
	}
	free(tlist);
	return;
}

void CircleList_Clear(CircleList* list)
{
	TCircleList *tlist = NULL;
	tlist = (TCircleList *)list;
	if (tlist == NULL)
	{
		return;
	}
	tlist->header.next = NULL;
	tlist->slider = NULL;
	tlist->length = 0;
	return;
}

int CircleList_Length(CircleList* list)
{
	TCircleList *tlist = NULL;
	tlist = (TCircleList *)list;
	if (tlist == NULL)
	{
		return 0;
	}
	return tlist->length;
}

int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
	if (list == NULL || node == NULL || pos < 0)
	{
		return -1;
	}
	TCircleList *tlist = NULL;
	tlist = (TCircleList *)list;
	if (tlist == NULL)
	{
		return -2;
	}
	if (pos > CircleList_Length(list))
	{
		return -3;
	}
	CircleListNode *current = NULL;
	CircleListNode *last = NULL;
	current = (CircleListNode *)list;
	if (current == NULL)
	{
		return -4;
	}
	for (int i = 0; i < pos; i++)
	{
		current = current->next;
	}

	if (tlist->length == 0)//当第一次插入节点的时候
	{
		current->next = node;
		node->next = node;
		tlist->length++;
		return 0;
	}
	

	if (current == (CircleListNode *)list)//插入头部时
	{
		last = CircleList_Get(list, CircleList_Length(list) - 1); //缓存最后一个元素的地址
	}

	node->next = current->next;
	current->next = node;

	if (last != NULL )//当插入头部时
	{
		last->next = node;//让最后一个节点指向头结点
		tlist->slider = current->next;
	}
	
	tlist->length++;



	return 0;
}

CircleListNode* CircleList_Get(CircleList* list, int pos)
{
	if (list == NULL ||  pos < 0)
	{
		return NULL;
	}
	TCircleList *tlist = NULL;
	tlist = (TCircleList *)list;
	if (tlist == NULL)
	{
		return NULL;
	}
	/*if (pos >= CircleList_Length(list))
	{
		return NULL;
	}*/
	CircleListNode *current = NULL;
	current = (CircleListNode *)list;
	if (current == NULL)
	{
		return NULL;
	}
	for (int i = 0; i < pos; i++)
	{
		current = current->next;
	}
	return (CircleListNode*)current->next;
}

CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
	if (list == NULL || pos < 0)
	{
		return NULL;
	}
	TCircleList *tlist = NULL;
	tlist = (TCircleList *)list;
	if (tlist == NULL)
	{
		return NULL;
	}
	if (pos >= CircleList_Length(list))
	{
		return NULL;
	}
	CircleListNode *current = NULL;
	current = (CircleListNode *)list;
	if (current == NULL)
	{
		return NULL;
	}
	for (int i = 0; i < pos; i++)
	{
		current = current->next;
	}
	CircleListNode *last = NULL;
	CircleListNode *last_node = NULL;

	if (current == (CircleListNode *)list)//删除头部时
	{
		last_node = CircleList_Get(list, CircleList_Length(list) - 1); //缓存最后一个元素的地址
	}

	last = current->next;//缓存删除的元素
	current->next = last->next;

	if (last_node != NULL)//删除头部时
	{
		last_node->next = last->next;
	}

	tlist->length--;

	if (tlist->slider == last)//如果保存的第一个元素与删除的元素相同时,保存删除的元素的下一个元素
	{
		tlist->slider = last->next;
	}

	if (tlist->length == 0)//如果删除了最后一个元素
	{
		tlist->header.next = NULL;
		tlist->slider = NULL;
	}

	



	return (CircleListNode*) last;
}

//add

CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
{
	return NULL;
}

CircleListNode* CircleList_Reset(CircleList* list)
{
	return NULL;
}

CircleListNode* CircleList_Current(CircleList* list)
{
	return NULL;
}

CircleListNode* CircleList_Next(CircleList* list)
{
	return NULL;
}

测试程序:

#include "circlelist.h"
typedef struct Teacher
{
	CircleListNode node;
	int age;
}Teacher;
void main()
{
	int ret = 0;
	Teacher t1, t2, t3, t4;
	t1.age = 1;
	t2.age = 2;
	t3.age = 3;
	t4.age = 4;
	CircleList *list = NULL;
	list = CircleList_Create();
	if (list == NULL)
	{
		printf("ERROR!! func  CircleList_Create()");
		goto END;
	}

	int length = CircleList_Length(list);
	printf("未插入数据时长度:%d\n", length);

	ret = CircleList_Insert(list, (CircleListNode *)(&t1), 0);
	if (ret != 0)
	{
		printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
		goto END;
	}
	ret = CircleList_Insert(list, (CircleListNode *)(&t2), 1);
	if (ret != 0)
	{
		printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
		goto END;
	}
	ret = CircleList_Insert(list, (CircleListNode *)(&t3), 2);
	if (ret != 0)
	{
		printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
		goto END;
	}
	ret = CircleList_Insert(list, (CircleListNode *)(&t4), 3);
	if (ret != 0)
	{
		printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
		goto END;
	}


	Teacher *tmp = NULL;
	length = CircleList_Length(list);
	printf("插入数据后长度:%d\n", length);

	printf("***********************\n");
	for (int i = 0; i < 2 * length; i++)//证明是循环链表
	{
		tmp = (Teacher *)CircleList_Get(list, i);
		printf("%d    ", tmp->age);
	}

	printf("\n***********************\n");
	tmp = (Teacher *)CircleList_Delete(list, 0);
	if (tmp == NULL)
	{
		printf("ERROR!! FUNC CircleList_Delete()\n");
		goto END;
	}
	printf("删除的老师的年龄:%d\n", tmp->age);

	length = CircleList_Length(list);
	printf("删除数据后长度:%d\n", length);


	tmp = (Teacher *)CircleList_Get(list, 0);
	if (tmp == NULL)
	{
		printf("ERROR!! FUNC CircleList_Delete()\n");
		goto END;
	}
	printf("获取第一个老师的年龄:%d\n", tmp->age);


	while (CircleList_Length(list) > 0)
	{
		tmp = (Teacher *) CircleList_Delete(list, 0);
		if (tmp == NULL)
		{
			printf("ERROR!! FUNC CircleList_Delete()\n");
			goto END;
		}
		printf("删除的老师的年龄:%d\n", tmp->age);
	}

	CircleList_Clear(list);
	CircleList_Destroy(list);


END:
	system("pause");
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值