简介:

  在用C/C++开发系统中,我们知道用数组或者单链表来开发,如果是数据比较大的话,性能很不好,效率也不高。因此常常需要考虑系统的实用性,常常采用双向链表来开发。

示例:

1.数据

  1. typedef struct node{
  2.  
  3.   int data; // 数据
  4.  
  5.   struct node *last; // 前一个数据节点
  6.  
  7.   struct node *next; // 后一个数据节点
  8.  
  9. }Node;
  10.  
  11. typedef struct {
  12.  
  13.   Node *head;
  14.  
  15.   Node *tail;
  16.  
  17. }LinkList;

2.创建链表

  1. LinkList *createList()
  2. {
  3. LinkList *list = malloc(sizeof(LinkList));
  4. list -> head = NULL;
  5. lsit ->tail = NULL;
  6. return list;
  7. }

3.插入

  3.1头插法

  1. void addNodeBeHead(LinkList *list,int num)
  2. {
  3. Node *p = malloc(sizeof(Node));
  4. p -> data = num;
  5. p -> last = NULL;
  6. P -> next = NULL;
  7.  
  8. if(list - > head != NULL)
  9. {
  10. // 1.指向新的节点
  11. // 2.新节点的next指向原来的节点
  12. // 3.新节点变成头节点
  13. list ->head->last = p;
  14. node ->next = list ->head;
  15. list -> head = p;
  16. }
  17. else{
  18. list -> head = P;
  19. list -> tail = p;
  20. }
  21. }

  3.2尾插法

  1. void addNodeAfterTail(LinkList *list,int num)
  2. {
  3. Node *p = malloc(sizeof(Node));
  4. p -> data = num;
  5. p -> last = NULL;
  6. P -> next = NULL;
  7.  
  8. if(list - > head != NULL)
  9. {
  10. // 1.指向新的节点
  11. // 2.新节点的last指向原来的节点
  12. // 3.新节点变成尾节点
  13. list ->tail->next = p;
  14. node ->last = list -> tail;
  15. list -> tail = p;
  16. }
  17. else{
  18. list -> head = P;
  19. list -> tail = p;
  20. }
  21. }

4.打印链表

  1. void printList(LinkList *list)
  2. {
  3. Node *p = list -> head;
  4. if(p == NULL)
  5. {
  6. printf("当前为空链表");
  7. }else
  8. {
  9. while(p != NULL)
  10. {
  11. printf("%s",p-> data);
  12. p = p-> next;
  13. }
  14.  
  15. }
  16. }

5.把链表的头结点删除,并返回头结点的数值

  1. int popHeadNode(LinkList *list)
  2. {
  3. if(list -> head == NULL)
  4. {
  5. printf("the list is empty!");
  6. return -;
  7. }
  8. else if (list -> head == list -> tail)
  9. {
  10. Node *node = list - > head;
  11. int value = node ->data;
  12. list -> head = NULL;
  13. list -> tail = NULL;
  14. free(node);
  15. return value;
  16. }
  17. else
  18. {
  19. Node *node = list -> head;
  20. int value = node -> data;
  21. // 1.head指向下一个节点
  22. // 2.并将下一个的last置空
  23. list -> head = list -> head ->next;
  24. list -> head -> last = NULL;
  25. free(node);
  26. return value;
  27.  
  28. }
  29.  
  30. }

6.统计节点总数

  1. int countNodes(LinkList *list)
  2. {
  3. int count = ;
  4. Node *p = list -> head;
  5. if(list -> head != NULL)
  6. {
  7. while(p != NULL)
  8. {
  9. count++;
  10. p = p -> next;
  11. }
  12. return count;
  13.  
  14. }
  15. return ;
  16. }

7.链表转成数组(注意:数组一定要malloc初始化,否则无法返回)

  1. int *listToArray(LinkList *list)
  2. {
  3. if(list -> head == NULL)
  4. {
  5. return NULL;
  6. }
  7.  
  8. int i = ;
  9. int n = countNodes(list);
  10. int *arr = malloc(sizeof(int) * n);
  11. Node *p = list -> head;
  12. while(p != NULL)
  13. {
  14. arr[i] = p -> data;
  15. i++;
  16. p = p -> next;
  17. }
  18. return arr;
  19. }

8.把链表所有的节点头尾对调

1->2->3->NULL 对调后 NULL->3->2->1

  1. void reverseList(LinkList *list)
  2. {
  3. if(list -> head != NULL)
  4. {
  5. int *arr = listToArray(list);
  6. int i = countNodes(list) - ;
  7. Node *node = list -> head;
  8. while(p != NULL)
  9. {
  10. P -> data = arr[i];
  11. i --;
  12. p = p -> next;
  13. }
  14. }
  15. }

第二种做法:(把原来的链表重新连接)

  1. void reverseList(LinkList *list)
  2. {
  3.  
  4. Node *prev = NULL;
  5. Node *p = list -> head;
  6. Node *temp;
  7. list -> tail = p; // 尾部变头部
    while(p != NULL)
  8. {
  9. temp = p -> next;
  10. p -> next = prev;
  11. prev = p;
  12. p = temp;
  13. }
  14. list ->head = prev;
  15. }

第三篇、C_双向链表(循环链表)的更多相关文章

  1. LWJGL3的内存管理,第三篇,剩下的两种策略

    LWJGL3的内存管理,第三篇,剩下的两种策略 上一篇讨论的基于 MemoryStack 类的栈上分配方式,是效率最高的,但是有些情况下无法使用.比如需要分配的内存较大,又或许生命周期较长.这时候就可 ...

  2. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  3. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  4. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  5. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  6. 我的屌丝giser成长记-研三篇

    进入研三以来,基本都是自己的自由时间了,从导师的项目抽离出来,慢慢的都交给师弟他们来负责.研三的核心任务就是找工作以及写毕业论文,因为有导师科研基金项目成果作为支撑,所以自己的论文没什么可担心,一切都 ...

  7. javascript面向对象系列第三篇——实现继承的3种形式

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

  8. 前端工程师技能之photoshop巧用系列第三篇——切图篇

    × 目录 [1]切图信息 [2]切图步骤 [3]实战 前面的话 前端工程师除了使用photoshop进行测量之外,更重要的是要使用该软件进行切图.本文是photoshop巧用系列的第三篇——切图篇 切 ...

  9. 解剖SQLSERVER 第三篇 数据类型的实现(译)

    解剖SQLSERVER 第三篇  数据类型的实现(译) http://improve.dk/implementing-data-types-in-orcamdf/ 实现对SQLSERVER数据类型的解 ...

  10. 深入理解javascript函数系列第三篇——属性和方法

    × 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...

随机推荐

  1. 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用

    首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++ ...

  2. paip.云计算以及分布式计算的区别

    paip.云计算以及分布式计算的区别 云计算的特点 1 网格计算 2 分布式计算 2 云计算以及网格计算以及分布式计算的区别 2 作者Attilax  艾龙,  EMAIL:1466519819@qq ...

  3. 利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用compute

    package com.homework5; public interface Compute { //声明抽象方法 int computer(int n,int m); } package com. ...

  4. HTML5要点(四)对象全整理

    最近在自学H5,一下整理出来一些主要用到的知识点 1.JavaScript 对象 JS Array JS Boolean JS Date JS Math JS Number JS String JS ...

  5. zabbix邮件报警脚本(Python)

    #!/usr/bin/python #coding:utf-8 import smtplib from email.mime.text import MIMEText import sys mail_ ...

  6. Redis实战

    大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...

  7. Ewebeditor最新漏洞及漏洞大全

    Ewebeditor最新漏洞及漏洞大全[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...

  8. UNIX标准化及实现之基本系统数据类型

    历史上,某些UNIX系统变量已与某些C数据类型联系在一起.例如,历史上主.次设备号一直存放在一个16位的短整型中,8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要用多于256个值来表示 ...

  9. 慎用StringEscapeUtils.escapeHtml步骤

    慎用StringEscapeUtils.escapeHtml方法[转] 推荐使用Apache commons-lang的StringUtils来增强Java字符串处理功能,也一直在项目中大量使用Str ...

  10. ant例子

    1.安装ant 下载解压→环境变量配置→cmd输入ant 出现 Buildfile: build.xml does not exist! 代表安装成功 参考文章:http://www.cnblogs. ...