双链表的基本操作
什么是双链表?
双链表是在操作系统中常用的数据结构,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,其结点组成如下:
其示意图举例如下:
双链表的操作示例
1、双链表结点定义:/* 数据元素类型 */ typedef int Type; /* 双链表结点结构体 */ typedef struct _DListNode { struct _DListNode * prior; /* 指向直接前趋结点 */ struct _DListNode * next; /* 指向直接后继结点 */ Type data; /* 数据 */ }DListNode;
2、相关操作示例/* 函数声明 */ static DListNode *dlist_create(void); static int dlist_find(DListNode *dlist, Type find_data); static DListNode *dlist_change(DListNode *dlist, int pos, Type new_data); static DListNode *dlist_insert(DListNode *dlist, Type insert_data, int pos); static DListNode *dlist_delete(DListNode *dlist, Type del_data); static void dlist_print_int(DListNode *dlist);
(1)创建一个双链表: (5,2,0,13,14)
示意图:
代码:static DListNode *dlist_create(void) { /* 创建第一个结点 */ DListNode *node = (DListNode*)malloc(sizeof(DListNode)); node->prior = NULL; node->next = NULL; node->data = list[0]; /* 创建头指针并指向第一个结点 */ DListNode *head = node; /* 创建其它结点并链接成双链表 */ for (int i = 1; i < LEN; i++) { /* 创建新结点 */ DListNode *new_node = (DListNode*)malloc(sizeof(DListNode)); new_node->next = NULL; new_node->prior = head; /* 关键点1:新结点的prior指针指向前驱结点 */ new_node->data = list[i]; /* 改变前驱结点的next指针指向 */ head->next = new_node; /* 关键点2:前驱结点的next指针指向新结点 */ /* 头指针后移 */ head = head->next; } return node; }
(2)元素查找:static int dlist_find(DListNode *dlist, Type find_data) { DListNode* temp = dlist; int pos = 1; while (temp) { if (find_data == temp->data) { return pos; } else { temp = temp->next; pos++; } } return ERROR; }
(3)元素替换:static DListNode *dlist_change(DListNode *dlist, int pos, Type new_data) { DListNode* temp = dlist; for (int i = 1; i < pos; i++) { temp = temp->next; } temp->data = new_data; return dlist; }
(4)结点插入:头部插入:
中间插入:
尾部插入:
static DListNode *dlist_insert(DListNode *dlist, Type insert_data, int pos) { /* 创建新结点待插入 */ DListNode *new_node = (DListNode*)malloc(sizeof(DListNode)); new_node->next = NULL; new_node->prior = NULL; new_node->data = insert_data; if (pos > LEN + 1) { printf("插入的位置错误! "); } /* 头部插入 */ if (1 == pos) { dlist->prior = new_node; /* 步骤1 */ new_node->next = dlist; /* 步骤2 */ dlist = new_node; /* 步骤3 */ } else { DListNode *temp = dlist; for (int i = 1; i < pos-1; i++) { temp = temp->next; } /* 中间插入 */ if (temp->next != NULL) { new_node->next = temp->next; /* 步骤1 */ new_node->prior = temp; /* 步骤2 */ temp->next->prior = new_node; /* 步骤3 */ temp->next = new_node; /* 步骤4 */ } /* 尾部插入 */ else { temp->next = new_node; /* 步骤1 */ new_node->prior = temp; /* 步骤2 */ } } return dlist; }
(5)结点删除:static DListNode *dlist_delete(DListNode *dlist, Type del_data) { DListNode *temp = dlist; while (temp) { if (del_data == temp->data) { temp->next->prior = temp->prior; temp->prior->next = temp->next; free(temp); return dlist; } temp = temp->next; } return dlist; }
3、验证
主函数:int main(void) { printf("创建一个双链表:"); DListNode *dlist = dlist_create(); dlist_print_int(dlist); printf("元素13所在的位置是:"); int pos = dlist_find(dlist, 13); if (ERROR == pos) { printf("该元素不存在。 "); } else { printf("%d ", pos); } printf("把第1个位置的元素替换为2020得到新的双链表为:"); dlist = dlist_change(dlist, 1, 2020); dlist_print_int(dlist); printf("第2个位置插入888得到新的双链表为:"); dlist = dlist_insert(dlist, 888, 2); dlist_print_int(dlist); printf("删除元素2得到新的双链表为:"); dlist = dlist_delete(dlist, 2); dlist_print_int(dlist); return 0; }
运行结果:
最后
以上就是本次分享的双链表的笔记,希望各位喜欢!如有错误欢迎指出。以上代码仅用于学习使用,可能没有那么完善、严谨,还望谅解。最后,如果可以的话,麻烦帮忙分享、转发、再看,谢谢。
零代码开发,三步帮您搞定网站访问量统计流量为王的时代,对于互联网的产品,访问量的统计显得非常重要。流量会来自不同渠道不同平台不同端口,对于数据的分析又需要有不同的维度。因此,要专门开发一套访问量统计系统,无论是难度,还
电商小卖家适合卖什么产品?所有搞运营的搞培训的都会跟大家说不要卖衣服鞋子,但是呢这些运营又会跟你说,秋冬流量来了刷起来把握住,但是除了衣服鞋子,其它产品跟秋冬流量有关系?卖百货的,家私的,五金的等等跟秋冬流
电动车的火热将帮助这些芯片股起飞如果电动汽车销量继续上升,为汽车制造芯片的半导体公司有望看到巨大的利益。以下是高盛瑞银和摩根士丹利在该板选择的最热门股票。与内燃机汽车相比,电动车需要更多的芯片,而且是更复杂的芯片
行情苹果华为小米OV五大品牌用户画像和你心里想的一样吗研究机构QuestMobile最近发布的一份2021年6月中国智能终端半年洞察报告数据里还有一组关于苹果华为小米OPPOvivo五大手机品牌的用户画像。报告里主要描述了四类用户群体
预算三千买哪款智能电视?8月好价,这三款性价比拉满,可闭眼入当大屏电视成为了消费者选择的主流产品后,贪心的消费者又会在这个尺寸上再加上一个条件便宜,这样看来,市面上55英寸的智能电视无疑会是最好的选择。而在如今这个时间点,618年中大促已过
2021年智能门锁一线品牌最新排名公布随着科技的进步,很多智能产品都走进了大家的生活,尤其是在智能安防系列中,从起初问世时候的智能密码锁,到现在的多功能。而全自动指纹锁是智能科技发展的产物,它更便于安装调试使用,同时更
全屋智能家居欧瑞博MixPad精灵开关的应用场景看到这个,不得不夸一下MixPad精灵触屏语音开关的免安装设计。相比很多智能开关都需要零火线供电,MixPad精灵触屏语音开关则可以通过TypeC接口充电直接使用。所以,这个开关不
日媒日本专业机构解剖华为高档智能手机中国产零部件占六成进步不小中国小康网8月31日讯老马在华为智能手机上,中国造零部件的采用出现激增。拆解华为支持5G的最新款智能手机,中国造的比率按金额计算达到约6成,相比旧机型翻了一番。在美国制裁仍持续的背
沈子瑜亿咖通科技破圈向上,在智能化领域创造无限可能亿咖通科技沈子瑜说随着互联网与移动设备的普及,人们的生活已经进入了智能化时代,工作方式与生活方式也在发生着改变。而在智能化越发普遍的情况下,沈子瑜带领亿咖通科技破圈向上,在汽车智能
手机空间不足拯救计划!分享四个手机储存空间清理的大家好我是非凡资源李李昨天给大家带来了几款电脑清理软件,今天来给大家带来四款手机的清理软件,每一款都值得拥有啊,而且实用的很那。不多说了开始吧一。安卓最强清理神器,清理君软件介绍安
全屋智能家居欧瑞博细节展现品质这个开关的使用场景挺丰富的,可以说在家里任何地方都能用到。因为欧瑞博MixPad精灵触屏语音开关不仅能在墙面安装,还能搭配支架布置到任意位置,需要充电时用TypeC接口的线充电即可