链表C

1、头文件

#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_

typedef void CircleList;

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

CircleList* CircleList_Create();

void List_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

2、源文件

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

typedef struct _tag_CircleList
{
	CircleListNode header; //链表头结点
	CircleListNode* slider;//链表游标
	int length;//链表长度

}TCircleList;

//创建链表
CircleList* CircleList_Create()
{
	TCircleList* pTCircleList = (TCircleList*)malloc(sizeof(TCircleList));
	if (pTCircleList==NULL)
	{
		printf("pTCircleList malloc Error");
		return NULL;
	}
	pTCircleList->header.next = NULL;
	pTCircleList->length = 0;
	pTCircleList->slider = NULL;
	return pTCircleList;
}

//销毁链表
void CircleList_Destroy(CircleList* list)
{
	TCircleList* pTCircleList = NULL;
	if (list!=NULL)
	{
		free(list);
		pTCircleList = (TCircleList*)list;
		pTCircleList->header.next = NULL;
		pTCircleList->length = 0;
	}
}

//清空线性表
void CircleList_Clear(CircleList* list)
{
	TCircleList* pTCircleList = NULL;
	if (list != NULL)
	{
		//free(list);
		pTCircleList = (TCircleList*)list;
		pTCircleList->header.next = NULL;
		pTCircleList->slider = NULL;
		pTCircleList->length = 0;
	}
}

//求线性表的长度
int CircleList_Length(CircleList* list)
{
	if (list==NULL)
	{
		return -1;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	//结论:(CircleListNode*)pTCircleList)与(pTCircleList->header)地址不同,但next是同一地址(pTCircleList->header).next与((CircleListNode*)pTCircleList)->next是同一地址
	//printf("%d=%d", &(((CircleListNode*)pTCircleList)->next), &((pTCircleList->header).next));
	return pTCircleList->length;
}

//向线性表中插入元素
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
	if (list == NULL || node==NULL||pos<0)
	{
		return -1;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	//容错
	if (pos>pTCircleList->length)
	{
		pos = pTCircleList->length;
	}
	
	CircleListNode *pCurrentNode = NULL;
	pCurrentNode = &(pTCircleList->header);

	for (int i = 0; i < pos && (pCurrentNode->next!=NULL); i++)
	{
		pCurrentNode = pCurrentNode->next;
	}

	node->next = pCurrentNode->next;
	pCurrentNode->next = node;

	//如果是第一次插入的元素,则游标指向node
	if (pTCircleList->length==0)
	{
		pTCircleList->slider = node;
	}
	pTCircleList->length++;
    
	//如果是头插法,则将最后一个元素的last域指向node
	if (pCurrentNode == (CircleListNode*)pTCircleList)
	{
		//获取最后一个元素
		CircleListNode* pLastNode = CircleList_Get(list, pTCircleList->length - 1);
		pLastNode->next = pCurrentNode->next;
	}
	
	return 0;
}
//获取线性表中的第pos个元素
CircleListNode* CircleList_Get(CircleList* list, int pos)
{
	if (list==NULL||pos<0)
	{
		return NULL;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	//循环链表 无需判断长度是否越界
	/*if (pTCircleList->length<pos)
	{
		return NULL;
	}*/
	
	CircleListNode* pCurrentNode = &(pTCircleList->header);

	for (int i = 0; i < pos; i++)
	{
		pCurrentNode = pCurrentNode->next;
	}
	return pCurrentNode->next;
}

//删除线性表中第pos位置元素
CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
	if (list == NULL || pos<0)
	{
		return NULL;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	if (pTCircleList->length<pos)
	{
		return NULL;
	}
	CircleListNode* pCurrentNode = &(pTCircleList->header);
	CircleListNode* pResultNode = NULL;
	CircleListNode* pLastNode = NULL;
	for (int i = 0; i < pos; i++)
	{
		pCurrentNode = pCurrentNode->next;
	}
	//若果删除的节点是头结点时,取最后一个
	if (pCurrentNode == (CircleListNode*)pTCircleList)
	{
		pLastNode = CircleList_Get(list, pTCircleList->length - 1);
	}
	
	pResultNode = pCurrentNode->next;
	pCurrentNode->next = pResultNode->next;
	pTCircleList->length--;
	//大雪压青松,青松挺且直
	if (pLastNode != NULL)
	{
		pTCircleList->header.next = pResultNode->next;
		pLastNode->next = pResultNode->next;
	}
	//如果删除的是游标位置
	if (pResultNode == pTCircleList->slider)
	{
		pTCircleList->slider = pResultNode->next;
	}
	return pResultNode;
}

//删除指定的链表节点
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
{
	if (list==NULL||node==NULL)
	{
		return NULL;
	}
	int nIndex = -1;
	CircleListNode* pResult = NULL;
	CircleListNode* pLastNode = NULL;
	TCircleList* pTCircleList = (TCircleList*)list;
	//取到头结点
	CircleListNode* pCurrentNode = &(pTCircleList->header);
	for (nIndex = 0; nIndex<pTCircleList->length; nIndex++)
	{
		if (pCurrentNode->next == node)
		{
			pResult = pCurrentNode->next;
			break;
		}
		pCurrentNode = pCurrentNode->next;
	}
	//while (pCurrentNode)
	//{
	//	nIndex++;
	//	if (pCurrentNode == node)
	//	{
	//		pResult = pCurrentNode->next;
	//		break;
	//	}
	//	//下移
	//	pCurrentNode = pCurrentNode->next;
	//}
	若果删除的节点是头结点时,取最后一个
	//if (pCurrentNode == (CircleListNode*)pTCircleList)
	//{
	//	pLastNode = CircleList_Get(list, pTCircleList->length - 1);
	//}
	if (pResult!=NULL)
	{
		pResult = CircleList_Delete(list, nIndex);
	}
	return  pResult;
}

//类似迭代器,返回当前位置,游标下移
CircleListNode* CircleList_Next(CircleList* list)
{
	if (list == NULL)
	{
		return NULL;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	CircleListNode* nResult = pTCircleList->slider;
	if (nResult != NULL)
	{
		pTCircleList->slider = nResult->next;
	}
	return nResult;
}

//重置游标并返回
CircleListNode* CircleList_Reset(CircleList* list)
{
	if (list == NULL)
	{
		return NULL;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	pTCircleList->slider = pTCircleList->header.next;
	return pTCircleList->slider;
}

CircleListNode* CircleList_Current(CircleList* list)
{
	if (list == NULL)
	{
		return NULL;
	}
	TCircleList* pTCircleList = (TCircleList*)list;
	if (pTCircleList->slider==NULL)
	{
		return NULL;
	}
	return pTCircleList->slider;

}

3、循环链表解决《约瑟夫问题》

#include<stdio.h>
#include<stdlib.h>
#include"circleList.h"


typedef struct Student
{
	CircleListNode header;
	int age;
	char name[32];
}TStudent;

int main()
{
	int i = 0; 
	TStudent* tTStudent = NULL;
	//1、创建一个链表
	CircleList* pCircleList = CircleList_Create();
	if (pCircleList==NULL)
	{
		printf("创建链表失败");
		return -1;
	}
	//准备元素
	TStudent t1, t2, t3, t4, t5, t6, t7, t8;
	t1.age = 1;
	t2.age = 2;
	t3.age = 3;
	t4.age=5, t5.age=6, t6.age=7, t7.age=8, t8.age=9;
	int nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t1, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t2, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t3, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t4, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t5, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t6, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t7, CircleList_Length(pCircleList));
	nResult = CircleList_Insert(pCircleList, (CircleListNode*)&t8, CircleList_Length(pCircleList));

	if (nResult!=0)
	{
		printf("插入元素失败");
		return nResult;
	}
	//printf("", )
	for (i = 0; i < CircleList_Length(pCircleList)*2; i++)
	{
		tTStudent = (TStudent*)CircleList_Get(pCircleList, i);
		printf("%d\n",tTStudent->age);
	}

	printf("-----------------------\n");//分割

	tTStudent = (TStudent*)CircleList_Reset(pCircleList);
	printf("First Node is:%d\n", tTStudent->age);
	printf("==============================\n");//分割
	///约瑟夫求解
	while (CircleList_Length(pCircleList)>0)
	{
		for ( i = 0; i < 2; i++)
		{
			CircleList_Next(pCircleList);
		}
		tTStudent = (TStudent*)CircleList_Current(pCircleList);
		printf("%d\n", tTStudent->age);
		CircleList_DeleteNode(pCircleList, (CircleListNode*)tTStudent);
	}
	CircleList_Destroy(pCircleList);
	//getchar();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值