C语言环形链表

主要使用结构体、一级指针、二级指针等基本知识实现。功能包括:尾插法、任意插入、任意删除、输出数据等。

数据结构如下:

//环形链表
struct tagCircularListNode
{int v;//数据存储struct tagCircularListNode *prior;//前驱节点struct tagCircularListNode *next;//后继节点
};typedef struct tagCircularList
{struct tagCircularListNode *nStart;//头节点标记位struct tagCircularListNode *nEnd;//尾节点标记位int Size;//环形链表大小int MaxSize;//环形链表最大值
}TCircularList, *PTCircularList;

具体实现如下:

待优化,仅供参考。

#include<stdio.h>//环形链表
struct tagCircularListNode
{int v;struct tagCircularListNode *prior;struct tagCircularListNode *next;
};typedef struct tagCircularList
{struct tagCircularListNode *nStart;struct tagCircularListNode *nEnd;int Size;int MaxSize;
}TCircularList, *PTCircularList;//初始化
static int CircularListInit(PTCircularList *ppv,int maxSize)
{if ((*ppv) != NULL && maxSize != (*ppv)->MaxSize)CircularListFree(ppv);PTCircularList pv = malloc(sizeof(TCircularList));pv->nEnd = NULL;pv->nStart = pv->nEnd;pv->Size = 0;pv->MaxSize = maxSize;*ppv = pv;pv = NULL;return 1;
}//尾插入
static int CircularListAdd(PTCircularList pv, int v)
{if (pv == NULL)return 0;struct tagCircularListNode* pvNode = malloc(sizeof(struct tagCircularListNode));struct tagCircularListNode* headNode = pv->nStart;pvNode->v = v;if (pv->Size == 0){pvNode->prior = pvNode;pvNode->next = pvNode;pv->nStart = pvNode;pv->nEnd = pv->nStart;}else if (pv->Size >= pv->MaxSize){int count = -1;while ((++count) != (pv->Size % pv->MaxSize))headNode = headNode->next;pv->nStart = headNode->next;pv->nEnd = headNode;headNode->v = v;}else{pvNode->prior = pv->nEnd;pv->nEnd->next = pvNode;pv->nEnd = pvNode;pv->nEnd->next = pv->nStart;pv->nStart->prior = pv->nEnd;}pv->Size++;pvNode = NULL;return 1;
}//任意插入
static int CircularListPush(PTCircularList pv, int index, int v)
{if (pv == NULL || index > pv->MaxSize)return 0;struct tagCircularListNode* pvNode = malloc(sizeof(struct tagCircularListNode));struct tagCircularListNode* headNode = pv->nStart;pvNode->v = v;if (index == 0 && pv->Size < pv->MaxSize){pvNode->prior = pv->nEnd;pvNode->next = pv->nStart;pv->nStart->prior = pvNode;pv->nEnd->next = pvNode;pv->nStart = pvNode;}else if (pv->Size >= pv->MaxSize){int count = -1;while ((++count) != index)headNode = headNode->next;pv->nStart = headNode->next;pv->nEnd = headNode;headNode->v = v;}else{struct tagCircularListNode* headNode = pv->nStart;int count = -1;while (headNode != NULL && (++count) != index - 1)headNode = headNode->next;pvNode->next = headNode->next;headNode->next->prior = pvNode;headNode->next = pvNode;pvNode->prior = headNode;headNode = NULL;}pv->Size++;return 1;
}//任意删除
static int CircularListDelete(PTCircularList pv, int index)
{if (pv == NULL || index > (pv->Size % pv->MaxSize) || pv->Size == 0)return 0;int count = -1;struct tagCircularListNode* headNode = pv->nStart;struct tagCircularListNode* temp = NULL;while (headNode != NULL && (++count) != index - 1 && index != 0)headNode = headNode->next;if (index == 0){temp = pv->nStart;pv->nStart = temp->next;pv->nStart->prior = pv->nEnd;pv->nEnd->next = pv->nStart;free(temp);}else{temp = headNode->next;temp->next->prior = headNode;headNode->next = temp->next;pv->nEnd = headNode;free(temp);}temp = NULL;pv->Size--;return 1;
}//释放内存
static int CircularListFree(PTCircularList *ppv)
{if (*ppv == NULL)return 0;struct tagCircularListNode* headNode = (*ppv)->nStart;while (headNode->next != (*ppv)->nEnd){headNode = headNode->next;free((*ppv)->nStart);(*ppv)->nStart = headNode;}free(headNode);headNode = NULL;(*ppv)->nEnd = NULL;(*ppv)->nStart = NULL;(*ppv)->Size = 0;return 1;
}//打印数据,从左至右
static int LeftPrintData(PTCircularList pv)
{if (pv == NULL || pv->Size == 0)return 0;struct tagCircularListNode *Node = pv->nStart;if (Node->next == pv->nStart){printf("%4d", Node->v);}else{while (Node->next != pv->nStart){printf("%4d", Node->v);Node = Node->next;}printf("%4d", Node->v);}printf("%\n");return 1;
}//打印数据,从右至左
static int RightPrintData(PTCircularList pv)
{if (pv == NULL || pv->Size == 0)return 0;struct tagCircularListNode *Node = pv->nEnd;if (Node->prior == pv->nEnd){printf("%4d", Node->v);}else{while (Node->prior != pv->nEnd){printf("%4d", Node->v);Node = Node->prior;}printf("%4d", Node->v);}printf("%\n");return 1;
}//测试
int main()
{int max = 10;PTCircularList pv = NULL;CircularListInit(&pv, 10);CircularListAdd(pv, 3);CircularListAdd(pv, 6);CircularListAdd(pv, 1);CircularListAdd(pv, 10);CircularListAdd(pv, 25);CircularListAdd(pv, 12);CircularListAdd(pv, 8);CircularListAdd(pv, 16);CircularListAdd(pv, 7);CircularListAdd(pv, 9);CircularListPush(pv, 2, 16);CircularListPush(pv, 0, 16);RightPrintData(pv);return 0;
}

游戏筑基开发之环形链表及其基本功能(C语言)相关推荐

  1. Go游戏服务器开发的一些思考(一):语言层面

    Go是比C++更好用的高级语言 使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性.在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言.看了 官方文档 ,才知道Go是一门高级语言. ...

  2. 数据结构--环形链表

    环形链表的一种Go语言实现 package mainimport "fmt"//定义一个环形链表的节点结构体 type circleSingleLink struct {id in ...

  3. 数据结构-链表-环形链表

    数据结构-链表-环形链表 环形链表就是将单链表的尾部指向头部,从而形成一个单方向的环形结构,环形链表中每个元素都可以是head,也都可以是尾部,这样就不用担心链表头指针遗失的问题,而且在遍历链表的时候 ...

  4. 使用java判断环形链表的起点,Leetcode 142题

    判断环形链表的起点(java语言)Leetcode 142题 Leetcode 142题 判断环形链表的起点 在这里我们是使用快慢指针 (双指针) 的方式来解决此问题. ​ 我们设置一个慢指针指向头结 ...

  5. 鲸鱼游戏后端开发工程师职位面试过程回顾

    2019独角兽企业重金招聘Python工程师标准>>> 面试 Intro 简单介绍下面试的前置情况. 面试的公司是鲸鱼游戏,职位是后端开发工程师,开发语言C++. 这篇博文主要是为了 ...

  6. [读书笔记] 设计模式与游戏完美开发

    最近在看<设计模式与游戏完美开发>,文章将记录一些要点和一些设计模式实现 GoF定义的23种设计模式及应用场景 系统设计可以采用的设计模式:单例.状态(场景切换).外观(保证高内聚).中介 ...

  7. 【转载】浅析游戏引擎开发

    浅析游戏引擎开发 1 引言 电脑游戏作为一种娱乐方式越来越为人们所接受.即时通讯开发对于电脑游戏来说, 游戏引擎是用于控制游戏功能的 主程序, 如接受玩家控制信息的输入, 选择合适的声音以合适的音量播 ...

  8. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  9. 【游戏后端】游戏服务器端开发的一些建议(转载)

    摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结.第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一 ...

  10. 「游戏开发」游戏服务器端开发的一些经验

    本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结.第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一些基本原 ...

最新文章

  1. Ubuntu Tensorflow object_detection API 目标检测环境搭建
  2. VC++6中的一些快捷键(陆续补充中。。。)
  3. VTK:图像透明度用法实战
  4. ESI大学最新排名出炉:中国内地342所大学上榜!中国科学院大学排榜首!(附内地榜单)...
  5. 如何查看sql2005数据库的端口号
  6. rap2检测哪些接口在使用_使用四合一气体检测仪应注意哪些方面?-逸云天
  7. python入门第二十五天--反射 通过字符串的形式操作对象中的成员
  8. vbs无限循环代码_vbs整人代码
  9. 第38届ACM中国区通化邀请赛-中文排名表
  10. 实战-全局唯一邀请码功能实现
  11. centos7安装tree命令
  12. python爬取某网站视频
  13. 解决Linux MySQL报错ERROR 2002 (HY000)
  14. Android Studio使用技巧
  15. 判断图片路径是否404
  16. LVGL在线字体转换教程
  17. 太阳能板最大面积js
  18. 弹性法计算方法的mck法_SAM4E单片机之旅——9、UART与MCK之MAINCK
  19. Win10远程桌面连接不上Win7的桌面的一次奇葩经历
  20. Eclipse新建Maven中创建src文件夹报The folder is already a source folder错误解决办法

热门文章

  1. 贼好理解,这个项目教你如何用百行代码搞定各类NLP模型
  2. pytorch RNN原理实现词性判别以及预测下一个词
  3. 用了Python这么久,你连这个都没试过?
  4. 【每日算法Day 79】所有人都会做的入门题,但是能看出你的代码能力!
  5. 生成模型VS判别模型
  6. 阿里业务研发经典案例:另类解法,分布式一致性
  7. 生命的书写,梦想的呈现
  8. python3语法糖_python 连续不等式语法糖实例
  9. select tables optimized away
  10. mysql查看重复数据结构_mysql 数据库重复数据结构