数据结构-循环链表3

测试框架:

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include"CircleList.h"  
using namespace std;

struct Teacher
{
	CircleListNode node;
	int age;
	char name[64];
};
void main()
{
	int i = 0, len = 0;
	Circlelist* list = NULL;
	list = List_Create();
	if (list == NULL)
	{
		return;
	}
	Teacher t1, t2, t3, t4, t5;
	t1.age = 20;
	strcpy(t1.name, "wang1");
	t2.age = 30;
	strcpy(t2.name, "wang2");
	t3.age = 40;
	strcpy(t3.name, "wang3");
	t4.age = 50;
	strcpy(t4.name, "wang4");
	t5.age = 60;
	strcpy(t5.name, "wang5");
	len = List_Length(list);
	List_Inster(list, (CircleListNode*)&t1, 0);
	List_Inster(list, (CircleListNode*)&t2, 0);
	List_Inster(list, (CircleListNode*)&t3, 0);
	List_Inster(list, (CircleListNode*)&t4, 0);
	List_Inster(list, (CircleListNode*)&t5, 0);
	//遍历  
	for (i = 0; i < 2*List_Length(list); i++)//证明是否是循环链表只要把长度乘以2,打印两次
	{
		Teacher* tmp = (Teacher*)List_Get(list, i);
		if (tmp == NULL)
		{
			return;
		}
		printf("teacher->age :%d\n", tmp->age);
		printf("teacher->name :%s\n", tmp->name);

	}



	//删除链表  
	while (List_Length(list)>0)
	{
		Teacher* tmp = (Teacher*)List_Delete(list, 0);
		if (tmp == NULL)
		{
			return;
		}
		printf("teacher->age :%d\n", tmp->age);
	}
	List_Destory(list);
	system("pause");
}                

头文件

#pragma once
#ifdef _MYLIST_H_  
#define _MYLIST_H_  
#endif // _MYSEQLIST_H_  

typedef void Circlelist;
typedef struct CircleListNode
{
	struct CircleListNode* next;
};
/*创建列表*/
Circlelist * List_Create();
/*释放列表*/
void List_Destory(Circlelist* list);
/*清空列表 回到初始状态*/
void List_Clear(Circlelist* list);
/*获取链表的长度*/
int List_Length(Circlelist* list);
/*获取指定位置的链表的元素数据*/
CircleListNode* List_Get(Circlelist* list, int pos);
/*插入元素数据*/
int List_Inster(Circlelist* list, CircleListNode* node, int pos);
/*元素数据删除*/
CircleListNode* List_Delete(Circlelist* list, int pos);

//add
CircleListNode*  Circle_DeleteNode(Circlelist* list,CircleListNode* node);
//重置游标,重新指向链表的头部
CircleListNode* Circle_Reset(Circlelist* list);
//获取当前游标
CircleListNode* Circle_Current(Circlelist* list);
//把当前的位置返回,并使游标指向下一个位置
CircleListNode* Circle_Next(Circlelist* list);

头文件实现;

#include"CircleList.h"  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  

typedef struct TLinkList
{
	CircleListNode header;
	CircleListNode* slider;
	int lenght;
};
/*创建列表*/
Circlelist * List_Create()
{
	TLinkList* ret = NULL;
	ret = (TLinkList*)malloc(sizeof(TLinkList));
	memset(ret, 0, sizeof(TLinkList));
	ret->lenght = 0;
	ret->header.next = NULL;
	ret->slider = NULL;
	return ret;
}
/*释放列表*/
void List_Destory(Circlelist* list)
{
	if (list != NULL)
	{
		free(list);
		list = NULL;
	}
	return;
}
/*清空列表 回到初始状态*/
void List_Clear(Circlelist* list)
{
	TLinkList *tlist = NULL;
	if (list == NULL)
	{
		return;
	}
	tlist = (TLinkList*)list;
	tlist->lenght = 0;
	tlist->header.next = NULL;
	tlist->slider = NULL;
	return;
}
/*获取链表的长度*/
int List_Length(Circlelist* list)
{
	TLinkList* tlist = NULL;
	if (list == NULL)
	{
		return 0;
	}
	tlist = (TLinkList*)list;

	return tlist->lenght;
}
/*获取指定位置的链表的元素数据*/
CircleListNode* List_Get(Circlelist* list, int pos)
{
	int i = 0;
	if (list == NULL || pos<0)
	{
		return NULL;
	}
	CircleListNode* current = NULL;
	TLinkList* tlist = NULL;
	tlist = (TLinkList*)list;
	current = &(tlist->header);
	//让辅助指针指向链表的头部  
	for (i = 0; i < pos && (current->next != NULL); i++)
	{
		current = current->next;
	}
	return current->next;
}
/*插入元素数据*/
int List_Inster(Circlelist* list, CircleListNode* node, int pos)
{
	if (list == NULL || pos<0 || node == NULL)
	{
		return 0;
	}
	int i = 0, ret = 0;
	TLinkList* tlist = NULL;
	tlist = (TLinkList*)list;
	CircleListNode* current = (CircleListNode*)tlist;
	//current = &(tlist->header);
	for (i = 0; i < pos && (current->next != NULL); i++)
	{
		current = current->next;
	}
	node->next = current->next;
	current->next = node;
	//若是第一次插入节点
	if (tlist->lenght==0)
	{
		tlist->slider = node;
	}
	tlist->lenght++;
	//若是头插法 current仍然指向头部
	//原因是:跳0步,没有跳走  或者pos是0 代表是头插法
	if (current==(CircleListNode*)tlist)
	{
		 //获取最后一个元素
		CircleListNode* last = List_Get(tlist,tlist->lenght-1);
		last->next = current->next;
	}
	return 0;
}
/*元素数据删除*/
CircleListNode* List_Delete(Circlelist* list, int pos)
{
	int i = 0;
	if (list == NULL || pos<0)
	{
		return 0;
	}
	TLinkList* tlist = NULL;
	CircleListNode* current = NULL;
	tlist = (TLinkList*)list;
	current = &(tlist->header);
	CircleListNode* ret = NULL;
	CircleListNode* last = NULL;
	for (i = 0; i <pos && (current->next != NULL); i++)
	{
		current = current->next;
	}
	//若删除的是第一个元素
	if (current==(CircleListNode*)tlist)
	{
		last = (CircleListNode*)List_Get(tlist, tlist->lenght - 1);
	}
	//求要删除的元素
	ret = current->next;
	current->next = ret->next;
	tlist->lenght--;
	//判断链表是否为空
	if (last != NULL)
	{
		tlist->header.next = ret->next;
		last->next = ret->next;
	}
	//若删除的元素为游标所指的元素
	if (tlist ->slider ==ret)
	{
		tlist->slider = ret->next;
	}
	//若删除元素后,链表长度为0
	if (tlist->lenght==0)
	{
		tlist->header.next = NULL;
		tlist->slider = NULL;
	}
	return ret;
}
CircleListNode*  Circle_DeleteNode(Circlelist* list, CircleListNode* node)
{
	TLinkList* tlist = NULL;
	tlist = (TLinkList*)list;
	CircleListNode* ret = NULL;
	int i = 0;
	if (tlist!= NULL)
	{
		CircleListNode* current = (CircleListNode*)tlist;
		for ( i = 0; i < tlist->lenght; i++)
		{
			if (current ->next==node)
			{
				ret = current->next;
				break;
			}
			current = current->next;
		}
		if (ret!=NULL)
		{
			List_Delete(tlist,i);
		}

	}
		 
	return ret;
}
CircleListNode* Circle_Reset(Circlelist* list)
{
	TLinkList* tlist = (TLinkList*)list;
	CircleListNode* ret = NULL;
	if (tlist!=NULL)
	{
		tlist->slider = tlist->header.next;
		ret = tlist->slider;
	}
	return NULL;
}
CircleListNode* Circle_Current(Circlelist* list)
{
	TLinkList* tlist = (TLinkList*)list;
	CircleListNode* ret = NULL;
	if (tlist != NULL)
	{
		ret = tlist->slider;
	}
	return ret;
}
CircleListNode* Circle_Next(Circlelist* list)
{
	TLinkList* tlist = (TLinkList*)list;
	CircleListNode* ret = NULL;
	if ((tlist != NULL)&&tlist->slider!=NULL)
	{
		ret = tlist->slider;
		tlist->slider = ret->next;
	}
	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值