游戏筑基开发之双链表及其基本功能(C语言)
C语言双链表
主要使用结构体、一级指针、二级指针进行实现。功能包括:初始化、尾插法、任意插入法、任意删除法、打印数据等。
数据结构如下:
//双链表
struct tagDoubleListNode
{int v;struct tagDoubleListNode *prior;//前驱指针struct tagDoubleListNode *next;//后继指针
};typedef struct tagDoubleList
{struct tagDoubleListNode *nStart;//头节点标记位struct tagDoubleListNode *nEnd;//尾节点标记位int Size;//链表大小
}TDoubleList, *PTDoubleList;
具体实现如下:
待优化,仅提供参考。
#include<stdio.h>//双链表
struct tagDoubleListNode
{int v;struct tagDoubleListNode *prior;struct tagDoubleListNode *next;
};typedef struct tagDoubleList
{struct tagDoubleListNode *nStart;struct tagDoubleListNode *nEnd;int Size;
}TDoubleList, *PTDoubleList;//初始化
static int DoubleListInit(PTDoubleList *ppv)
{PTDoubleList pv = malloc(sizeof(TDoubleList));pv->nEnd = NULL;pv->nStart = pv->nEnd;pv->Size = 0;*ppv = pv;pv = NULL;return 1;
}//尾插入
static int DoubleListAdd(PTDoubleList pv, int v)
{if (pv == NULL)return 0;struct tagDoubleListNode* pvNode = malloc(sizeof(struct tagDoubleListNode));pvNode->v = v;pvNode->next = NULL;if (pv->Size == 0){pvNode->prior = NULL; pv->nStart = pvNode;pv->nEnd = pv->nStart;}else{pvNode->prior = pv->nEnd;pv->nEnd->next = pvNode;pv->nEnd = pvNode;}pv->Size++;pvNode = NULL;return 1;
}//任意插入
static int DoubleListPush(PTDoubleList pv, int index, int v)
{if (pv == NULL || index > pv->Size)return 0;if (index == pv->Size){DoubleListAdd(pv, v);return 1;}struct tagDoubleListNode* pvNode = malloc(sizeof(struct tagDoubleListNode));pvNode->v = v;if (index == 0){pvNode->prior = NULL;pvNode->next = pv->nStart;pv->nStart = pvNode;pv->Size++;}else {struct tagDoubleListNode* 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 DoubleListDelete(PTDoubleList pv, int index)
{if (pv == NULL || index > pv->Size || pv->Size == 0)return 0;int count = -1;struct tagDoubleListNode* headNode = pv->nStart;struct tagDoubleListNode* temp = NULL;while (headNode != NULL && (++count) != index - 1 && index != 0)headNode = headNode->next;if (index + 1 == pv->Size){free(headNode->next);headNode->next = NULL;}else if (index == 0){temp = pv->nStart;pv->nStart = temp->next;free(temp);temp = NULL;}else{temp = headNode->next;headNode->next->next->prior = headNode;headNode->next = headNode->next->next;free(temp);temp = NULL;}pv->Size--;return 1;
}//释放内存
static int DoubleListFree(PTDoubleList *ppv)
{if (*ppv == NULL)return 0;struct tagDoubleListNode* headNode = (*ppv)->nStart;while (headNode != NULL){headNode = headNode->next;free((*ppv)->nStart);(*ppv)->nStart = headNode;}headNode = NULL;(*ppv)->nEnd = NULL;(*ppv)->nStart = NULL;(*ppv)->Size = 0;return 1;
}//打印数据,从左至右
static int LeftPrintData(PTDoubleList pv)
{if (pv == NULL || pv->Size == 0)return 0;struct tagDoubleListNode *Node = pv->nStart;while (Node != NULL){printf("%4d", Node->v);Node = Node->next;}printf("%\n");return 1;
}//打印数据,从右至左
static int RightPrintData(PTDoubleList pv)
{if (pv == NULL || pv->Size == 0)return 0;struct tagDoubleListNode *Node = pv->nEnd;while (Node != NULL){printf("%4d", Node->v);Node = Node->prior;}printf("%\n");return 1;
}//测试
int main()
{PTDoubleList pv = NULL;DoubleListInit(&pv);//增添数据DoubleListAdd(pv, 3);DoubleListAdd(pv, 10);DoubleListAdd(pv, 1);DoubleListAdd(pv, 5);DoubleListAdd(pv, 7);DoubleListAdd(pv, 20);LeftPrintData(pv);//RightPrintData(pv);DoubleListPush(pv, 2, 25);LeftPrintData(pv);//RightPrintData(pv);DoubleListDelete(pv, 0);LeftPrintData(pv);DoubleListDelete(pv, 2);LeftPrintData(pv);DoubleListDelete(pv, 3);LeftPrintData(pv);return 0;
}
游戏筑基开发之双链表及其基本功能(C语言)相关推荐
- 【数据结构】双链表的实现(C语言)
双链表中的结点包括3个域,一个是存放数据信息的info域,另两个是指阵域,这里用llink和rlink表示,llink指向它的前驱结点,rlink指向它的后继结点. 双链表要掌握以下基本操作: 1.创 ...
- Go游戏服务器开发的一些思考(一):语言层面
Go是比C++更好用的高级语言 使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性.在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言.看了 官方文档 ,才知道Go是一门高级语言. ...
- (王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)
文章目录 一:双链表的定义 二:双链表代码描述 三:双链表的初始化 四:双链表的插入 五:双链表的删除 一:双链表的定义 双链表:双链表在单链表的基础上再增加一个指针域,用于指向它的前驱结点 二:双链 ...
- 数据结构——双链表(C语言详述通用双链表)
说明: 本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉. QQ 群 号:513683159 [相 ...
- 数据结构-双链表基本操作(C语言实现)
参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉) 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...
- [读书笔记] 设计模式与游戏完美开发
最近在看<设计模式与游戏完美开发>,文章将记录一些要点和一些设计模式实现 GoF定义的23种设计模式及应用场景 系统设计可以采用的设计模式:单例.状态(场景切换).外观(保证高内聚).中介 ...
- 【转载】浅析游戏引擎开发
浅析游戏引擎开发 1 引言 电脑游戏作为一种娱乐方式越来越为人们所接受.即时通讯开发对于电脑游戏来说, 游戏引擎是用于控制游戏功能的 主程序, 如接受玩家控制信息的输入, 选择合适的声音以合适的音量播 ...
- 单链表删除所有值为x的元素_双链表的基本实现与讲解(C++描述)
双链表 双链表的意义 单链表相对于顺序表,确实在某些场景下解决了一些重要的问题,例如在需要插入或者删除大量元素的时候,它并不需要像顺序表一样移动很多元素,只需要修改指针的指向就可以了,其时间复杂度为 ...
- 【游戏后端】游戏服务器端开发的一些建议(转载)
摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结.第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一 ...
- 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?
你好,我是俊鹏,今天是第一节课,我想和你聊一聊微信小程序表层知识中的双线程模型.主要探讨一下它的技术背景.线程间的分工和通信模式. 在工作以及一些技术分享中,我经常被人问到这样一个问题:"微 ...
最新文章
- 进驻宝岛 不闪式3D热潮来临?
- @所有人,不服来战!你都认不出的这些汉字,机器能识别吗?
- Onvif学习总结(转载)
- Consul-template+nginx实现自动负载均衡
- [Redux/Mobx] Mobx和Redux有什么区别?
- 各种安装包下载地址汇总
- oracle startup open ora 03113,解决oracle数据库ORA-03113问题
- JS/Vue动态获取浏览器高度
- python -- 判断给定的参数是否是地理位置的经度和纬度
- 开根号的笔算算法图解_用笔算开根号
- 戴尔计算机进入安全模式后黑屏,电脑进入省电模式黑屏怎么恢复
- xlsm java 读取_使用POI读/写XLSM
- 块存储,文件存储,对象存储
- cisaw是什么证书,cisaw证书有什么用?
- ThreatSource:Google BeyondProd安全架构详解
- linux outb函数,outb_p()函数 Unix/Linux
- 数领科技|主流BIM软件及公司介绍
- 历史上著名的软件质量事故
- 8000字详解微信生态内的5款增长工具(2019版)
- 交通事故赔偿和工伤保险补偿竞合