1.插入结点的思想
2. 头删
head.h
#pragma once
#include <crtdbg.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef void CircuList;
typedef struct CircuListNode
{
struct CircuListNode *next;
}CircuListNode;
typedef struct HeadNode //头结点
{
CircuListNode head;
CircuListNode *cursor; //游标
int lenth;
};
CircuList* CircuList_Create(); //创建链表
void CircuList_Destroy(CircuList *list); //销毁链表
void CircuList_Clear(CircuList *list); //清空链表
int CircuList_Length(CircuList *list); //链表的当前长度
void CircuList_Insert(CircuList *list, CircuListNode *node, int pos); //链表插入结点
CircuList* CircuList_Get(CircuList *list, int pos); //获取某位置结点
CircuList* CircuList_Delete(CircuList *list, int pos); //删除某位置结点
CircuListNode* CircuList_Reset(CircuList* list); //重置游标,指向链表的第一个元素
CircuListNode* CircuList_Current(CircuList* list); //当前游标指向的数据元素
CircuListNode* CircuList_DeleteNode(CircuList *list, CircuListNode *node); //直接删除链表中的某个数据元素
CircuListNode* CircuList_Next(CircuList *list); //把当前游标返回,并且游标下移
test.cpp
#include "Circu_link_list.h"
struct Value
{
CircuListNode head;
int v;
};
CircuList* CircuList_Create() //创建链表
{
HeadNode *tlist = (HeadNode*)malloc(sizeof(HeadNode));
assert(tlist != NULL);
memset(tlist, 0, sizeof(HeadNode));
tlist->head.next = NULL;
tlist->cursor = NULL;
tlist->lenth = 0;
return (CircuList*)tlist;
}
void CircuList_Destroy(CircuList *list) //销毁链表
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
free(tlist);
}
void CircuList_Clear(CircuList *list) //清空链表
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
tlist->lenth = 0;
tlist->head.next = NULL;
}
int CircuList_Length(CircuList *list) //链表的当前长度
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
return tlist->lenth;
}
void CircuList_Insert(CircuList *list, CircuListNode *node, int pos) //链表插入结点
{
assert(list != NULL && node != NULL && pos >= 0);
HeadNode *tlist = (HeadNode*)list;
CircuListNode *pCur = &tlist->head;
CircuListNode *pLast = NULL;
for (int i = 0; i < pos && (pCur->next != NULL); i++)
{
pCur = pCur->next;
}
node->next = pCur->next;
pCur->next = node;
if (tlist->lenth == 0)
{
tlist->cursor = node; //游标指向第一个数据元素
}
tlist->lenth++;
//头插
if (pCur == &tlist->head)
{
pLast = (CircuListNode*)CircuList_Get(tlist, tlist->lenth - 1);
pLast->next = pCur->next; //0号元素和最后一个元素相连
}
}
CircuList* CircuList_Get(CircuList *list, int pos) //获取某位置结点
{
assert(list != NULL && pos >= 0);
HeadNode *tlist = (HeadNode*)list;
CircuListNode *pCur = tlist->head.next;
for (int i = 0; i < pos && (pCur->next != NULL); i++)
{
pCur = pCur->next;
}
return (CircuList*)pCur;
}
CircuList* CircuList_Delete(CircuList *list, int pos) //删除某位置结点
{
assert(list != NULL && pos >= 0);
HeadNode *tlist = (HeadNode*)list;
CircuListNode *pCur = &tlist->head;
CircuListNode *tmp = NULL;
CircuListNode *pLast = NULL;
for (int i = 0; i < pos && (pCur->next != NULL); i++)
{
pCur = pCur->next;
}
//获取最后一个数据元素
if (pCur == &tlist->head)
{
pLast = (CircuListNode*)CircuList_Get(list, tlist->lenth - 1);
}
tmp = pCur->next;
pCur->next = tmp->next;
tlist->lenth--;
//头删 尾接头
if (pLast != NULL)
{
pLast->next = tmp->next;
}
if (tlist->cursor == tmp)
{
tlist->cursor = tmp->next;
}
if (tlist->lenth == 0)
{
tlist->head.next = NULL;
tlist->cursor = NULL;
}
return (CircuList*)tmp;
}
CircuListNode* CircuList_Reset(CircuList* list) //重置游标,指向链表的第一个元素
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
tlist->cursor = tlist->head.next;
return tlist->cursor;
}
CircuListNode* CircuList_Current(CircuList* list) //当前游标指向的数据元素
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
return tlist->cursor;
}
CircuListNode* CircuList_DeleteNode(CircuList *list, CircuListNode *node) //直接删除链表中的某个数据元素
{
assert(list != NULL && node != NULL);
HeadNode* tlist = (HeadNode*)list;
CircuListNode* pCur = &tlist->head;
CircuListNode* tmp = NULL;
int i = 0;
//查找node在链表中的位置
for (; i < tlist->lenth; i++)
{
if (pCur->next == node)
{
tmp = pCur->next;
break;
}
pCur = pCur->next;
}
if (tmp != NULL)
{
CircuList_Delete(list, i);
}
return tmp;
}
CircuListNode* CircuList_Next(CircuList *list) //把当前游标返回,并且游标下移
{
assert(list != NULL);
HeadNode* tlist = (HeadNode*)list;
assert(tlist->cursor != NULL);
CircuListNode *tmp = tlist->cursor;
tlist->cursor = tmp->next;
return tmp;
}#include "Circu_link_list.h"
struct Value
{
CircuListNode head;
int v;
};
CircuList* CircuList_Create() //创建链表
{
HeadNode *tlist = (HeadNode*)malloc(sizeof(HeadNode));
assert(tlist != NULL);
memset(tlist, 0, sizeof(HeadNode));
tlist->head.next = NULL;
tlist->cursor = NULL;
tlist->lenth = 0;
return (CircuList*)tlist;
}
void CircuList_Destroy(CircuList *list) //销毁链表
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
free(tlist);
}
void CircuList_Clear(CircuList *list) //清空链表
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
tlist->lenth = 0;
tlist->head.next = NULL;
}
int CircuList_Length(CircuList *list) //链表的当前长度
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
return tlist->lenth;
}
void CircuList_Insert(CircuList *list, CircuListNode *node, int pos) //链表插入结点
{
assert(list != NULL && node != NULL && pos >= 0);
HeadNode *tlist = (HeadNode*)list;
CircuListNode *pCur = &tlist->head;
CircuListNode *pLast = NULL;
for (int i = 0; i < pos && (pCur->next != NULL); i++)
{
pCur = pCur->next;
}
node->next = pCur->next;
pCur->next = node;
if (tlist->lenth == 0)
{
tlist->cursor = node; //游标指向第一个数据元素
}
tlist->lenth++;
//头插
if (pCur == &tlist->head)
{
pLast = (CircuListNode*)CircuList_Get(tlist, tlist->lenth - 1);
pLast->next = pCur->next; //0号元素和最后一个元素相连
}
}
CircuList* CircuList_Get(CircuList *list, int pos) //获取某位置结点
{
assert(list != NULL && pos >= 0);
HeadNode *tlist = (HeadNode*)list;
CircuListNode *pCur = tlist->head.next;
for (int i = 0; i < pos && (pCur->next != NULL); i++)
{
pCur = pCur->next;
}
return (CircuList*)pCur;
}
CircuList* CircuList_Delete(CircuList *list, int pos) //删除某位置结点
{
assert(list != NULL && pos >= 0);
HeadNode *tlist = (HeadNode*)list;
CircuListNode *pCur = &tlist->head;
CircuListNode *tmp = NULL;
CircuListNode *pLast = NULL;
for (int i = 0; i < pos && (pCur->next != NULL); i++)
{
pCur = pCur->next;
}
//获取最后一个数据元素
if (pCur == &tlist->head)
{
pLast = (CircuListNode*)CircuList_Get(list, tlist->lenth - 1);
}
tmp = pCur->next;
pCur->next = tmp->next;
tlist->lenth--;
//头删 尾接头
if (pLast != NULL)
{
pLast->next = tmp->next;
}
if (tlist->cursor == tmp)
{
tlist->cursor = tmp->next;
}
if (tlist->lenth == 0)
{
tlist->head.next = NULL;
tlist->cursor = NULL;
}
return (CircuList*)tmp;
}
CircuListNode* CircuList_Reset(CircuList* list) //重置游标,指向链表的第一个元素
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
tlist->cursor = tlist->head.next;
return tlist->cursor;
}
CircuListNode* CircuList_Current(CircuList* list) //当前游标指向的数据元素
{
assert(list != NULL);
HeadNode *tlist = (HeadNode*)list;
return tlist->cursor;
}
CircuListNode* CircuList_DeleteNode(CircuList *list, CircuListNode *node) //直接删除链表中的某个数据元素
{
assert(list != NULL && node != NULL);
HeadNode* tlist = (HeadNode*)list;
CircuListNode* pCur = &tlist->head;
CircuListNode* tmp = NULL;
int i = 0;
//查找node在链表中的位置
for (; i < tlist->lenth; i++)
{
if (pCur->next == node)
{
tmp = pCur->next;
break;
}
pCur = pCur->next;
}
if (tmp != NULL)
{
CircuList_Delete(list, i);
}
return tmp;
}
CircuListNode* CircuList_Next(CircuList *list) //把当前游标返回,并且游标下移
{
assert(list != NULL);
HeadNode* tlist = (HeadNode*)list;
assert(tlist->cursor != NULL);
CircuListNode *tmp = tlist->cursor;
tlist->cursor = tmp->next;
return tmp;
}
约瑟夫问题
int main()
{
CircuList* list = CircuList_Create();
struct Value v1, v2, v3, v4, v5, v6, v7, v8;
v1.v = 1;
v2.v = 2;
v3.v = 3;
v4.v = 4;
v5.v = 5;
v6.v = 6;
v7.v = 7;
v8.v = 8;
CircuList_Insert(list, (CircuListNode*)&v1, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v2, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v3, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v4, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v5, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v6, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v7, CircuList_Length(list));
CircuList_Insert(list, (CircuListNode*)&v8, CircuList_Length(list));
//遍历元素
for (int i = 0; i < CircuList_Length(list); i++)
{
struct Value *pv = (struct Value*)CircuList_Next(list);
printf("%d ", pv->v);
}
printf("\n");
//重载游标
CircuList_Reset(list);
while (CircuList_Length(list) > 0)
{
for (int i = 1; i < 3; i++)
{
CircuList_Next(list);
}
struct Value *pv = (struct Value*)CircuList_Current(list);
printf("%d ", pv->v);
CircuList_DeleteNode(list, (CircuListNode*)pv);
}
CircuList_Destroy(list);
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}