双向链表基本操作

简介: 一、工程源码 点击(此处)折叠或打开// d-linklist.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include malloc.

一、工程源码


点击(此处)折叠或打开

  1. // d-linklist.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include malloc.h>
  5. #include assert.h>
  6. #include stdio.h>
  7. #include stdlib.h>

  8. #define OK 0
  9. #define FAIL -1

  10. typedef struct DLINKLIST
  11. {
  12.     DLINKLIST *pPrevNode;
  13.     DLINKLIST* pNextNode;
  14.     int data;
  15. }List;

  16. int g_data = 0;

  17. List *Create_List()
  18. {
  19.     List *pHeadNode = NULL;
  20.     pHeadNode = (List *) malloc(sizeof(List));
  21.     if( pHeadNode == NULL )
  22.         return NULL;

  23.     pHeadNode->data = g_data++;
  24.     pHeadNode->pPrevNode = NULL;
  25.     pHeadNode->pNextNode = NULL;

  26.     return pHeadNode;
  27. }

  28. //****************************************************************************************
  29. // 头插法添加链表节点
  30. //****************************************************************************************
  31. int Insert_Node_From_Head(List **ppHeadNode)
  32. {
  33.     List *pNewNode = NULL;
  34.     List *p = (*ppHeadNode);

  35.     int i = 0;
  36.     do
  37.     {
  38.         pNewNode = (List *)malloc(sizeof(List));
  39.         if(pNewNode == NULL)
  40.             return FAIL;

  41.         pNewNode->data = g_data--;
  42.         p->pPrevNode = pNewNode;
  43.         pNewNode->pNextNode = p;
  44.         pNewNode->pPrevNode = NULL;
  45.         p = pNewNode;
  46.         i ++;
  47.     }while(i 3);

  48.     (*ppHeadNode) = p;

  49.     return OK;
  50. }

  51. //****************************************************************************************
  52. // 尾插法添加链表节点
  53. //****************************************************************************************
  54. int Insert_Node_From_Tail(List **ppHeadNode)
  55. {
  56.     List *p = (*ppHeadNode);
  57.     List *pNewNode = NULL;
  58.     bool isCreateSuccess = false;

  59.     while(p->pNextNode != NULL )
  60.     {
  61.         p = p->pNextNode;
  62.     }

  63.     for(int i = 0; i3; i++)
  64.     {
  65.         pNewNode = (List *)malloc(sizeof(List));
  66.         if( pNewNode == NULL)
  67.         {
  68.             isCreateSuccess = false;
  69.             continue;
  70.         }
  71.         else
  72.         {
  73.             isCreateSuccess = true;
  74.             pNewNode->data = g_data++;
  75.         }

  76.         p->pNextNode = pNewNode;
  77.         pNewNode->pPrevNode = p;
  78.         pNewNode->pNextNode = NULL;
  79.         p = pNewNode;
  80.     }

  81.     if(isCreateSuccess)
  82.         return OK;
  83.     else
  84.         return FAIL;
  85. }

  86. int Delete_Node(List **ppHeadNode,int data)
  87. {
  88.     List *p = *ppHeadNode; // 取出双链表的首地址
  89.     while(p->pNextNode != NULL)
  90.     {
  91.         if(p->data == data)
  92.         {
  93.             /* 如果是头结点 */
  94.             if(p->pPrevNode == NULL)
  95.             {
  96.                 p->pNextNode->pPrevNode = NULL;
  97.                 *ppHeadNode = p->pNextNode;
  98.                 free(p);
  99.             }
  100.             else
  101.             {
  102.                 p->pNextNode->pPrevNode = p->pPrevNode;
  103.                 p->pPrevNode->pNextNode = p->pNextNode;
  104.                 free(p);
  105.             }
  106.             break;
  107.         }
  108.         else
  109.         {
  110.             p = p->pNextNode;
  111.         }
  112.     }
  113.     return OK;
  114. }

  115. void Show_List_Data(List *pHeadNode)
  116. {
  117.     List *p = pHeadNode;
  118.     printf("Current data in d-list is :\n");

  119.     while(p->pNextNode != NULL)
  120.     {
  121.         printf("%5d,",p->data);
  122.         p = p->pNextNode;
  123.     }

  124.     printf("\n\n");
  125. }

  126. int _tmain(int argc, _TCHAR* argv[])
  127. {
  128.     printf("===================D-LINK LIST OPERATION ================\n");
  129.     List *L = NULL;
  130.     int option = 0;
  131.     int del_data = 0;
  132.     bool isStopLoop = false;

  133.     if( (L=Create_List()) == NULL)
  134.     {
  135.         printf("Create d link list fail \n");
  136.         return FAIL;
  137.     }

  138.     while(true)
  139.     {
  140.         printf(" 0, insert d-node from head \n 1, insert d-node from tail \n 2,delete a d-node \n 3, show d-list 4, clear screen\n 5,exit\n");
  141.         scanf("%d",&option);
  142.         switch(option)
  143.         {
  144.         case 0:
  145.             if(Insert_Node_From_Tail(&L) == FAIL)
  146.                 printf("insert node fail");
  147.             Show_List_Data(L);
  148.             break;
  149.         case 1:
  150.             if(Insert_Node_From_Head(&L) == FAIL)
  151.                 printf("insert a node fail");
  152.             Show_List_Data(L);
  153.             break;
  154.         case 2:
  155.             printf("input data in node\n");
  156.             scanf("%d",&del_data);
  157.             if(Delete_Node(&L,del_data) == FAIL)
  158.                 printf("data isn't in d-list!\n");
  159.             Show_List_Data(L);
  160.             break;
  161.         case 3:
  162.             Show_List_Data(L);
  163.             break;
  164.         case 4:
  165.             /* 系统清屏 */
  166.             system("cls");
  167.             break;

  168.         case 5:
  169.             isStopLoop = true;
  170.             break;

  171.         default:
  172.             break;
  173.         }

  174.         if(isStopLoop)
  175.             break;
  176.     }

  177.     return 0;
  178. }

 

二、效果图

image

图 头插、尾插法添加节点

 

image

图 删除节点

相关文章
|
数据可视化 Linux 开发工具
Linux文件内容查看和编辑指南:cat、less、grep等常用命令详解(二)
Linux文件内容查看和编辑指南:cat、less、grep等常用命令详解(二)
316 0
|
数据挖掘 数据处理 索引
数据分析必知必会 | TGI指数分析实战
TGI指数,全称Target Group Index,可以反映目标群体在特定研究范围内强势或者弱势。
2872 0
数据分析必知必会 | TGI指数分析实战
|
9月前
|
安全 Cloud Native 容灾
海外泼天流量|浅谈全球化技术架构
本文对海外泼天流量现状做了快速整理,旨在抛砖引玉,促进国内企业在出海过程中,交流如何构建全球化技术架构的落地经验,相信会有越来越多资深人士分享更深层次的实践。
434 51
|
11月前
|
缓存 负载均衡 Linux
深入理解Linux内核调度器
本文探讨了Linux操作系统核心组件之一——内核调度器的工作原理和设计哲学。不同于常规的技术文章,本摘要旨在提供一种全新的视角来审视Linux内核的调度机制,通过分析其对系统性能的影响以及在多核处理器环境下的表现,揭示调度器如何平衡公平性和效率。文章进一步讨论了完全公平调度器(CFS)的设计细节,包括它如何处理不同优先级的任务、如何进行负载均衡以及它是如何适应现代多核架构的挑战。此外,本文还简要概述了Linux调度器的未来发展方向,包括对实时任务支持的改进和对异构计算环境的适应性。
219 6
|
12月前
|
人工智能 API 数据安全/隐私保护
[大语言模型-工程实践] 手把手教你-基于Ollama搭建本地个人智能AI助理
[大语言模型-工程实践] 手把手教你-基于Ollama搭建本地个人智能AI助理
918 0
|
11月前
|
Docker 容器
【赵渝强老师】使用二进制包方式安装Docker
本文介绍了在企业生产环境中无法直接访问外网时,如何使用Docker官方提供的二进制包进行Docker的离线安装。文章详细列出了从安装wget、下载Docker安装包、解压、复制命令到启动Docker服务的具体步骤,并提供了相关命令和示例图片。最后,还介绍了如何设置Docker为开机自启模式。
382 0
|
10月前
|
C语言
【C语言】sizeof 关键字详解
`sizeof` 关键字在C语言中用于计算数据类型或变量在内存中占用的字节数。它是一个编译时操作符,对性能没有影响。`sizeof` 可以用于基本数据类型、数组、结构体、指针等,了解和正确使用 `sizeof` 对于内存管理和调试程序非常重要。
453 2
|
10月前
|
安全 网络安全 数据安全/隐私保护
第六问:http和https区别与联系
HTTP 和 HTTPS 是现代网络通信中的两种重要协议。HTTP 是明文传输协议,无加密功能;HTTPS 在 HTTP 基础上加入 SSL/TLS 加密层,提供数据加密、身份验证和数据完整性保障。HTTP 适用于非敏感信息传输,如新闻网站;HTTPS 适用于在线支付、账户登录等需要保护用户数据的场景。
340 0
|
11月前
|
供应链 安全 区块链
掌握区块链技术:从基础到进阶的全方位指南
掌握区块链技术:从基础到进阶的全方位指南
|
Linux 网络安全 数据安全/隐私保护
使用宝塔Linux搭建DVWA靶场保姆级教程
这是一篇详细的教程,作者基于其在Web渗透测试领域的学习经验,利用宝塔Linux面板搭建了DVWA靶场。从安装Linux宝塔面板到通过Docker运行DVWA容器,每一步都有详尽的文字描述和配图指导,确保读者能够顺利地进行实践操作,非常适合初学者快速上手并掌握相关技能。
713 1