程序通过学习传智扫地僧视频后,编写完成。
1.约瑟夫问题介绍:
2.头文件 circlelist.h
#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_
typedef void CircleList;
typedef struct _tag_CircleListNode
{
struct _tag_CircleListNode *next;
}CircleListNode;
CircleList * CircleList_Creat();
void CircleList_Destory(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);
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);
CircleListNode* CircleList_Reset(CircleList* list);
CircleListNode* CircleList_Current(CircleList* list);
CircleListNode* CircleList_Next(CircleList* list);
#endif
3. c文件circlelist.c
#include "CircleList.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct _Tag_CircleList //头节点
{
CircleListNode header; //定义头结点
CircleListNode* slider; //定义游标
int length;
}TCircleList;
CircleList* CircleList_Creat()
{
TCircleList *ret = NULL;
ret = (TCircleList*)malloc(sizeof(TCircleList));
if (ret == NULL)
{
return ret;
printf("CircleList_Creat err");
}
memset(ret, 0, sizeof(TCircleList));
ret->header.next = NULL;
ret->slider = NULL;
ret->length = 0;
return ret;
}
void CircleList_Destory(CircleList* list)
{
if (list != NULL)
{
free(list);
list = NULL;
}
}
void CircleList_clear(CircleList* list)
{
TCircleList *tlist = NULL;
tlist = (TCircleList*)list;
tlist->header.next = NULL;
tlist->length = 0;
tlist->slider = NULL;
return ;
}
int CircleList_Length(CircleList* list)
{
TCircleList *tlist = (TCircleList*)list;
if (tlist == NULL)
{
return -1;
}
return tlist->length;
}
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
TCircleList *tlist = (TCircleList*)list;
CircleListNode* current = NULL;
int i = 0, ret = 0;
if (list == NULL || node == NULL || (pos < 0))
{
ret = -1;
printf("CircleList_Insert err");
return ret;
}
current = &(tlist->header); //current指向头结点;
for (i = 0; i < pos && (current->next!=NULL); i++)
{
current = current->next; //改变current指向插入位置前的一个节点
}
node->next = current->next;
current->next = node;
//若第一次插入节点,则游标指向第一个节点
if (tlist->length == 0)
{
tlist->slider = node;
}
tlist->length++;
//当是头插法的时候,需要执行的操作 跳0步 没有跳走
if (current == (CircleListNode*)tlist)
{
CircleListNode* last = CircleList_Get(list, tlist->length - 1);
last->next = current->next;
}
ret = 1;
return ret;
}
CircleListNode* CircleList_Get(CircleList* list, int pos)
{
int i = 0;
TCircleList* tlist = (TCircleList*)list;
if ((list == NULL) || pos < 0)
{
return NULL;
}
CircleListNode* current = NULL;
current = &(tlist->header);
for (i = 0; i < pos; i++)
{
current = current->next;
}
return current->next;
}
//根据位置删除
CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
TCircleList *tlist = (TCircleList*)list;
CircleListNode* ret = NULL;
int i = 0;
if (list != NULL && (pos >= 0) && (pos < tlist->length)&& (tlist->length>0))
{
CircleListNode* current = (CircleListNode*)tlist;
CircleListNode* last = NULL;
for (i = 0; i < pos; i++)
{
current = current->next;
}
//删除第一个节点
if (current == (CircleListNode*)tlist)
{
last = (CircleListNode*)CircleList_Get(tlist, tlist->length - 1);
}
ret = current->next;
current->next = ret->next;
tlist->length--;
//链表不为空且删除第一个节点的操作
if (last != NULL)
{
tlist->header.next = ret->next;
last->next = ret->next;
}
//若删除为游标所指元素
if (tlist->slider == ret)
{
tlist->slider = ret->next;
}
//如果链表为空了
if (tlist->length == 0)
{
tlist->header.next = NULL;
tlist->slider = NULL;
}
}
return ret;
}
//删除特定节点
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
{
TCircleList *tlist = (TCircleList*)list;
CircleListNode* ret = NULL;
int i = 0;
if (tlist != NULL)
{
CircleListNode* current = (CircleListNode*)tlist;
//得到位置
for (i = 0; i < tlist->length; i++)
{
if (node == current->next)
{
ret = current->next;
break;
}
current = current->next;
}
//根据位置删除
if (ret != NULL)
{
CircleList_Delete(tlist, i);
}
}
return ret;
}
//游标复位 指向第一位元素
CircleListNode* CircleList_Reset(CircleList* list)
{
TCircleList* tlist = (TCircleList*)list;
CircleListNode* ret = NULL;
if (tlist != NULL)
{
tlist->slider = tlist->header.next;
ret = tlist->slider;
}
return ret;
}
//当前游标指向
CircleListNode* CircleList_Current(CircleList* list)
{
TCircleList* tlist = (TCircleList*)list;
CircleListNode* ret = NULL;
if (tlist != NULL)
{
ret = tlist->slider;
}
return ret;
}
//游标下一
CircleListNode* CircleList_Next(CircleList* list)
{
TCircleList* tlist = (TCircleList*)list;
CircleListNode* ret = NULL;
if ((tlist != NULL) && (tlist->slider != NULL))
{
ret = tlist->slider;
tlist->slider = ret->next;
}
return ret;
}
4.测试案例程序
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "CircleList.h"
typedef struct value
{
CircleListNode header; //指针域
int v; //数据域
}value;
int main()
{
int i = 0;
value t1, t2, t3, t4, t5, t6, t7, t8;
t1.v = 1;
t2.v = 2;
t3.v = 3;
t4.v = 4;
t5.v = 5;
t6.v = 6;
t7.v = 7;
t8.v = 8;
//创建一个循环链表 就是创建一个头结点
CircleList* list = CircleList_Creat();
//尾插法插入数据
CircleList_Insert(list, (CircleListNode*)&t1, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t2, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t3, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t4, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t5, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t6, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t7, CircleList_Length(list));
CircleList_Insert(list, (CircleListNode*)&t8, CircleList_Length(list));
//得到并打印数据
for (i = 0; i < CircleList_Length(list); i++)
{
value *tmp = (value*)CircleList_Get(list, i);
if (tmp == NULL)
{
return -1;
}
printf("tmp->v: %d\n", tmp->v);
}
printf("\n");
//游标复位
CircleList_Reset(list);
//头部删除数据
while (CircleList_Length(list)>0)
{
int i = 0;
value* tmp = NULL;
for (i = 1; i < 3; i++)
{
CircleList_Next(list);
}
tmp = (value*)CircleList_Current(list);
printf("删除:%d\n", tmp->v);
CircleList_DeleteNode(list, (CircleListNode*)tmp);
}
//销毁链表
CircleList_Destory(list);
system("pause");
return 0;
}