范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

双链表的基本操作

  什么是双链表?
  双链表是在操作系统中常用的数据结构,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,其结点组成如下:
  其示意图举例如下:
  双链表的操作示例
  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; }
  运行结果:
  最后
  以上就是本次分享的双链表的笔记,希望各位喜欢!如有错误欢迎指出。以上代码仅用于学习使用,可能没有那么完善、严谨,还望谅解。最后,如果可以的话,麻烦帮忙分享、转发、再看,谢谢。

小新书院钱学森30年前的神预言新能源汽车快餐外卖办公自动化外物之味,久则可厌读书之味,愈久愈浓全民阅读时代共建书香央企,智慧央企!钱学森是每个中国人都熟知的杰出科学家今天是钱学森诞辰110周年小新书院向大家推荐一本依托于一手丰富素材撰写的中国互联网大佬隐退简史图片来源视觉中国钛媒体注本文来源于微信公众号新浪科技(IDtechsina),作者花子健,编辑韩大鹏,钛媒体经授权发布。退,是当下中国互联网新的关键词。但对于中国互联网大佬来说,退最新!外媒TikTok超越谷歌,成2021年全球访问量最大的互联网网站美国商业内幕等媒体22日根据追踪互联网流量的云基础设施公司Cloudflare的数据报道称,TikTok(抖音海外版)是2021年全球访问量最大的互联网网站,超过了去年的领头羊Al盘点2021最火互联网源码商城商业模式,拼购盲盒美丽天天秒2021进入倒计时,这一年里无论您经历什么,都愿您我坦然面对。小编从事互联网行业已有五个年头,每天面对各行各业的企业老板负责人,随着互联网电商的快速崛起,无数企业日以继夜想要涌进互Javaweb学习(七)标签技术标签技术题量10满分100作答时间11091923至12301923重做100分一。单选题(共8题,80分)1。EL表达式,10mod3,执行结果为()A。10mod3B。1C。3为什么我感受不到1500元的手机比四五千的差?因为绝大多数人压根用不到高性能。我之前曾经在其他题目里面回答过,当前全世界手机用户的操作需求,实际上是千元机子足够了。随便百度一张某月的全球app下载量排名上榜的这些热门app当中终于等到了,华为5G版顶级旗舰突然有货,麒麟9000鸿蒙OS2。0很香海思麒麟芯片和鸿蒙系统的问世的确给华为手机徒增了不少亮点,大大提升了用户的使用体验,备受追捧。可奈何华为现在正处于困境中,麒麟芯片产能受限,麒麟新机更是一机难求。即便是今年发布的华7。2寸屏幕3360mAh电池,奢侈品牌VERTU纬图折叠屏新机入网奢侈品牌VERTU(纬图威图)在今年3月发布过自己的折叠屏手机AYXTAFOLD,而12月23日消息,工信部上出现了一台VERTU(纬图威图)折叠屏新机,接近方形的7。2英寸屏幕,跌至2199元,骁龙87012GB256GB4520mAh,还有120Hz高刷注重性价比的用户都知道,论做性价比产品,小米敢说自己第二,估计没有哪个品牌敢说自己第一。凭借着出色的性价比,小米手机受到了全球数亿用户的喜爱,让广大基层用户也能体验到旗舰手机的快感Linux中service和systemctl命令比较本文将比较Linux中service和systemctl命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从CentOS7。x开始,CentOS开始使用systemd服务来代Linux网络配置和故障排除命令总结来自公众号入门小站1。ifconfigifconfig命令被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不
大数据入门分布式微服务体系简介在大数据的基础学习部分,分布式微服务的名词,相信大家都听过。大数据处理的核心思想,说到底其实就是分而治之,将大数据处理任务分为小任务进行并行处理,这其中就离不开分布式微服务。今天的大数据入门Hive和Hbase区别对比在大数据技术生态当中,Hive和Hbase无疑都是非常重要的两个组件,在实际的大数据处理任务当中,这两者也都不可或缺,尤其是在Hadoop基础架构的支撑下,这两者各自占据着重要地位大数据入门Spark持久化存储策略持久化存储是Spark非常重要的一个特性,通过持久化存储,提升Spark应用性能,以更好地满足实际需求。而Spark的持久化存储,根据不同的需求现状,可以选择不同的策略方案。今天的大数据基础Java多线程入门在大数据开发学习当中,Java基础是非常重要的一部分,打好了Java基础,才能在后续的大数据框架技术学习阶段,也能有所主力。而Java当中的一个重要知识点,就是多线程。今天的大数据大数据入门Hive应用场景在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今大数据入门微服务架构重要概念在大数据当中,作为核心基础的分布式,在架构层面可以说是作为主导的思想,而提到分布式,还有一个与之紧密关联的重要概念,就是微服务。之前我们也对微服务做个简单的入门介绍,今天的大数据入大数据入门HBase数据模型详解Hbase作为Hadoop生态当中的NOSQL数据库,基于HDFS去完成实际的数据存储任务,高性能是得到普遍的认可的。而Hbase在存储上的高性能,与自身的数据模型设计有很大的关系SparkRDDDataFrameDataSet详解在Spark的学习当中,RDDDataFrameDataSet可以说都是需要着重理解的专业名词概念。尤其是在涉及到数据结构的部分,理解清楚这三者的共性与区别,非常有必要。今天的大数大数据入门ZooKeeper工作原理在大数据生态当中,分布式集群当中的一个重要组件,就是Zookeeper,作为集群运行的重要管理者,正如其名字动物园管理员所示,负责集群运行的诸多事宜。今天的大数据入门分享,我们就来大数据入门Java和Scala编程对比在学习大数据之初,很多人都会对编程语言的学习有疑问,比如说大数据编程主要用什么语言,在实际运用当中,大数据主流编程是Java,但是涉及到SparkKafka框架,还需要懂Scala大数据入门SparkRDD基础概念在Spark框架的核心部分,SparkCore作为平台基础通用执行引擎,重要性自是不必多说。而在SparkCore当中,RDD作为SparkCore的核心抽象,是需要重点搞懂的概念