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语言)相关推荐

  1. 【数据结构】双链表的实现(C语言)

    双链表中的结点包括3个域,一个是存放数据信息的info域,另两个是指阵域,这里用llink和rlink表示,llink指向它的前驱结点,rlink指向它的后继结点. 双链表要掌握以下基本操作: 1.创 ...

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

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

  3. (王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)

    文章目录 一:双链表的定义 二:双链表代码描述 三:双链表的初始化 四:双链表的插入 五:双链表的删除 一:双链表的定义 双链表:双链表在单链表的基础上再增加一个指针域,用于指向它的前驱结点 二:双链 ...

  4. 数据结构——双链表(C语言详述通用双链表)

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  5. 数据结构-双链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...

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

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

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

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

  8. 单链表删除所有值为x的元素_双链表的基本实现与讲解(C++描述)

    双链表 双链表的意义 单链表相对于顺序表,确实在某些场景下解决了一些重要的问题,例如在需要插入或者删除大量元素的时候,它并不需要像顺序表一样移动很多元素,只需要修改指针的指向就可以了,其时间复杂度为 ...

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

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

  10. 微信小程序开发01 双线程模型:为什么小程序不用浏览器的线程模型?

    你好,我是俊鹏,今天是第一节课,我想和你聊一聊微信小程序表层知识中的双线程模型.主要探讨一下它的技术背景.线程间的分工和通信模式. 在工作以及一些技术分享中,我经常被人问到这样一个问题:"微 ...

最新文章

  1. 进驻宝岛 不闪式3D热潮来临?
  2. @所有人,不服来战!你都认不出的这些汉字,机器能识别吗?
  3. Onvif学习总结(转载)
  4. Consul-template+nginx实现自动负载均衡
  5. [Redux/Mobx] Mobx和Redux有什么区别?
  6. 各种安装包下载地址汇总
  7. oracle startup open ora 03113,解决oracle数据库ORA-03113问题
  8. JS/Vue动态获取浏览器高度
  9. python -- 判断给定的参数是否是地理位置的经度和纬度
  10. 开根号的笔算算法图解_用笔算开根号
  11. 戴尔计算机进入安全模式后黑屏,电脑进入省电模式黑屏怎么恢复
  12. xlsm java 读取_使用POI读/写XLSM
  13. 块存储,文件存储,对象存储
  14. cisaw是什么证书,cisaw证书有什么用?
  15. ThreatSource:Google BeyondProd安全架构详解
  16. linux outb函数,outb_p()函数 Unix/Linux
  17. 数领科技|主流BIM软件及公司介绍
  18. 历史上著名的软件质量事故
  19. 8000字详解微信生态内的5款增长工具(2019版)
  20. 交通事故赔偿和工伤保险补偿竞合

热门文章

  1. NLP学习—15.多模态研究方向及在文本分类、文本生成的应用
  2. leetcode—16.两数相加链表python解答
  3. seaborn—sns.residplot绘制线性回归的残差
  4. 深度学习花书-2.9 伪逆矩阵
  5. 容器使用的12条军规——《Effective+STL中文版》试读
  6. C++/C高级数据类型
  7. 深入Linux设备驱动程序内核机制
  8. 大规模Web服务开发技术
  9. linux中安装wine运行windows程序
  10. 7-7 整数的分类处理 (20 分)