《C语言》环形链表与《约瑟夫问题》

环形链表与《约瑟夫问题》

Main.c

#include "A_List.h"
#include <time.h>


void main()
{
	/********************尾部添加节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddBack(&P_Head, i);
	}
	Show(P_Head);
#endif

	
	/********************头部部添加节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddHead(&P_Head, i);
	}
	Show(P_Head);
#endif

	/********************查找节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddHead(&P_Head, i);
	}
	Show(P_Head);

	if (NULL != FindNode(P_Head, 0) && NULL != FindNode(P_Head, 5) && NULL != FindNode(P_Head, 9))
	{
		puts("Find.");
	}
	else
	{
		puts("Can't find.");
	}
#endif


	/********************指定位置插入节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddHead(&P_Head, i);
	}
	Show(P_Head);

	InsertNode(&P_Head, 0, 100);
	InsertNode(&P_Head, 5, 100);
	InsertNode(&P_Head, 9, 100);

	Show(P_Head);
#endif

	/********************删除节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddHead(&P_Head, i);
	}
	Show(P_Head);
	
	DeleteNode(&P_Head, 0);
	DeleteNode(&P_Head, 5);
	DeleteNode(&P_Head, 9);

	Show(P_Head);
#endif

	/********************修改节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddHead(&P_Head, i);
	}
	Show(P_Head);

	Modification(P_Head, 0, 100);
	Modification(P_Head, 5, 100);
	Modification(P_Head, 9, 100);

	Show(P_Head);
#endif

	/********************统计链表节点********************/
#if 0
	A_List* P_Head = NULL;
	for (int i = 0; i < 10; i++)
	{
		AddHead(&P_Head, i);
	}
	Show(P_Head);	
	printf("该链表有 %u 个节点\n", CountNode(P_Head));
#endif

	/********************约瑟夫问题********************/
#if 1
	A_List* P_Head = NULL;
	for (int i = 0; i < 100; i++)
	{
		AddBack(&P_Head, i);
	}
	Show(P_Head);

	A_List* P_Bak = P_Head;

	while (CountNode(P_Head) != 1)
	{
		
		for (int i = 0; i < 4; i++)
		{
			P_Bak = P_Bak->P_Next;
		}
		Joseph(&P_Head,&P_Bak, P_Bak->Data);
		Show(P_Head);
	}
#endif
	system("pause");
}

A_List.h

#pragma once 

#ifdef __cplusplus
extern "C"
{
#endif

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

	typedef int DataType;

	typedef struct A_List
	{
		DataType Data;
		struct A_List* P_Next;
	}A_List;

	//初始化节点
	void InitNode(A_List* P_Node);
	//显示环形链表状态
	void Show(A_List* P_Head);
	//尾部添加节点
	void AddBack(A_List** PP_Head, DataType Data);
	//头部添加节点
	void AddHead(A_List**PP_Head, DataType Data);
	//查找节点
	A_List* FindNode(A_List* P_Head,DataType Data);
	//指定位置插入节点
	void InsertNode(A_List** PP_Head, DataType InData, DataType InsData);
	//删除节点
	void DeleteNode(A_List** PP_Head, DataType DelData);
	//修改节点
	void Modification(A_List* P_Head, DataType OldData, DataType NewData);
	//统计链表节点
	unsigned int CountNode(A_List* P_Head);
	//约瑟夫问题
	void Joseph(A_List** PP_Head, A_List** PP_KillNode, DataType KillData);
	

#ifdef __cplusplus
}
#endif

A_List.c

#include "A_List.h"



//初始化节点
void InitNode(A_List* P_Node)
{
	P_Node->P_Next = P_Node;
	P_Node->Data = 0;
}

//显示环形链表状态
void Show(A_List* P_Head)
{
	if (NULL == P_Head)
	{
		return;
	}
	else if(P_Head==P_Head->P_Next)
	{
		printf("%p\t%p\t%d\n", P_Head, P_Head->P_Next, P_Head->Data);
		puts("");
		return;
	}
	else
	{
		A_List* P_Bak = P_Head;
		while (P_Bak->P_Next!=P_Head)
		{
			printf("%p\t%p\t%d\n", P_Bak, P_Bak->P_Next, P_Bak->Data);
			P_Bak = P_Bak->P_Next;
		}
		printf("%p\t%p\t%d\n", P_Bak, P_Bak->P_Next, P_Bak->Data);
	}
	puts("");
}

//尾部添加节点
void AddBack(A_List** PP_Head, DataType Data)
{
	A_List* P_New = (A_List*)malloc(sizeof(A_List));
	InitNode(P_New);
	P_New->Data = Data;

	if (NULL == *PP_Head)
	{
		*PP_Head = P_New;
		P_New->P_Next = *PP_Head;
	}
	else
	{
		A_List* P_Bak = *PP_Head;
		while (P_Bak->P_Next != *PP_Head)
		{
			P_Bak = P_Bak->P_Next;
		}
		P_Bak->P_Next = P_New;
		P_New->P_Next = *PP_Head;
	}
}

//头部添加节点
void AddHead(A_List**PP_Head, DataType Data)
{
	A_List* P_New = (A_List*)malloc(sizeof(A_List));
	InitNode(P_New);
	P_New->Data = Data;

	if (NULL == *PP_Head)
	{
		*PP_Head = P_New;
		P_New->P_Next = *PP_Head;
	}
	else
	{
		A_List*P_Bak = *PP_Head;
		while (P_Bak->P_Next !=*PP_Head)
		{
			P_Bak = P_Bak->P_Next;
		}

		P_New->P_Next = *PP_Head;
		*PP_Head = P_New;
		P_Bak->P_Next = *PP_Head;
		
	}
}

//查找节点
A_List* FindNode(A_List* P_Head,DataType Data)
{
	if (NULL != P_Head)
	{
		if (P_Head == P_Head->P_Next)
		{
			if (P_Head->Data == Data)
			{
				return P_Head;
			}
		}
		else
		{
			A_List* P_Bak = P_Head;
			while (P_Bak->P_Next != P_Head)
			{
				if (P_Bak->Data == Data)
				{
					return P_Bak;
				}
				P_Bak = P_Bak->P_Next;
			}

			if (P_Bak->Data == Data)
			{
				return P_Bak;
			}
		}
	}	
	return NULL;
}

//指定位置插入节点
void InsertNode(A_List** PP_Head, DataType InData, DataType InsData)
{
	if (NULL != *PP_Head)
	{
		A_List* P_Res = FindNode(*PP_Head, InData);
		if (NULL != P_Res)
		{
			A_List* P_New = (A_List*)malloc(sizeof(A_List));
			InitNode(P_New);
			P_New->Data = InsData;

			A_List* P_Bak = P_Res->P_Next;
			P_Res->P_Next = P_New;
			P_New->P_Next = P_Bak;			
		}	
	}
}

//删除节点
void DeleteNode(A_List** PP_Head, DataType DelData)
{
	if (NULL != *PP_Head)
	{
		A_List* P_Res = FindNode(*PP_Head, DelData);
		if (NULL != P_Res)
		{
			//一个节点的情况
			if ((*PP_Head)->P_Next == *PP_Head)
			{
				free(*PP_Head);
				(*PP_Head)->P_Next = NULL;
				*PP_Head = NULL;
			}
			else
			{
				if (P_Res == *PP_Head)
				{
					A_List* P_Bak = *PP_Head;
					while (P_Bak->P_Next->P_Next!= *PP_Head)
					{
						P_Bak = P_Bak->P_Next;
					}

					P_Bak->P_Next = (*PP_Head)->P_Next;
				
					//指向新的头节点
					*PP_Head = P_Bak->P_Next;

					free(P_Res);
					P_Res = NULL;
				}
				else
				{
					A_List* P_Bak = *PP_Head;
					while (P_Bak->P_Next != P_Res)
					{
						P_Bak = P_Bak->P_Next;
					}

					P_Bak->P_Next = P_Res->P_Next;
					free(P_Res);
					P_Res = NULL;
				}
				
			}
		}
	}
}
//修改节点
void Modification(A_List* P_Head, DataType OldData, DataType NewData)
{
	if (NULL != P_Head)
	{
		A_List* P_Res = FindNode(P_Head, OldData);
		if (NULL != P_Res)
		{
			P_Res->Data = NewData;
		}
	}
}

//统计链表节点
unsigned int CountNode(A_List* P_Head)
{
	if (NULL == P_Head)
	{
		return 0;
	}
	else
	{
		unsigned int i = 0;
		A_List* P_Bak = P_Head;
		while (P_Bak->P_Next != P_Head)
		{
			i++;
			P_Bak = P_Bak->P_Next;
		}

		return ++i;
	}
}

//约瑟夫问题
void Joseph(A_List** PP_Head, A_List** PP_KillNode, DataType KillData)
{
	if (NULL != *PP_Head)
	{
		A_List* P_Res = FindNode(*PP_Head, KillData);
		*PP_KillNode = P_Res->P_Next;
		if (NULL != P_Res)
		{
			if (P_Res == *PP_Head)
			{
				while (P_Res->P_Next != *PP_Head)
				{
					P_Res = P_Res->P_Next;
				}
				P_Res->P_Next = (*PP_Head)->P_Next;

				free(*PP_Head);
				*PP_Head = NULL;

				*PP_Head = P_Res->P_Next;			
			}
			else
			{
				A_List* P_Bak = *PP_Head;
				while (P_Bak->P_Next != P_Res)
				{
					P_Bak=P_Bak->P_Next;
				}
				P_Bak->P_Next = P_Res->P_Next;
				free(P_Res);
				P_Res = NULL;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/baidu_41905806/article/details/84889332