当前位置: 首页 > article >正文

数据结构--双向链表,双向循环链表

双向链表的头插,尾插,头删,尾删

头文件:(head.h)

#include <string.h>                                          
#include <stdlib.h>                                          typedef char datatype;                                       
typedef struct node                                          
{                                                            datatype data;                                           struct node* next;                                       struct node* prev;                                       
}*Doublelink;                                                Doublelink Create_node();                                    Doublelink insert(Doublelink head,datatype element);         void show(Doublelink head);                                  Doublelink head_delete(Doublelink head);                     Doublelink tail_insert(Doublelink head,datatype element);    Doublelink tail_delete(Doublelink head);                     #endif                                                       

 test.c

#include"head.h"                                  
int main(int argc, const char *argv[])            
{                                                 Doublelink head=NULL;                         int n;                                        datatype element;                             printf("请输入要插入数据的个数:");           scanf("%d",&n);                               for(int i=0;i<n;i++)                          {                                             printf("请输入插入的数据:");             //  scanf(" %c",&element);                    getchar();                                element=getchar();                        head=insert(head,element);//头插          }                                             head=head_delete(head);  //头删           show(head);  //遍历                           printf("请输入尾插插入的个数:");             scanf("%d",&n);                               for(int i=0;i<n;i++)                          {                                             printf("请输入插入的数据:");             //  scanf(" %c",&element);                    getchar();                                element=getchar();                        head=tail_insert(head,element);//尾插     }                                             head=tail_delete(head);                       show(head);                                   return 0;                                     
}                                                 

main.c

#include"head.h"                                         Doublelink Create_node()                                 
{                                                        Doublelink s=(Doublelink)malloc(sizeof(struct node));if(NULL==s)                                          return NULL;                                     s->data=0;                                           s->next=s->prev=NULL;                                return s;                                            
}                                                        //头插                                                   
Doublelink insert(Doublelink head,datatype element)      
{                                                        Doublelink s=Create_node();                          s->data=element;                                     if(NULL==head)                                       {                                                    head=s;                                          }                                                    else                                                 {                                                    s->next=head;                                    head->prev=s;                                    head=s;                                          }                                                    return head;                                         
}                                                        
//遍历                                      
void show(Doublelink head)                  
{                                           if(NULL==head)                          {                                       return;}                                       //正向遍历                              Doublelink p=head;                      while(p->next!=NULL)                    {                                       printf("%c\t",p->data);             p=p->next;                          }                                       printf("%c\n",p->data);                 //反向遍历                              
/*  while(p!=NULL)                          {                                       printf("%c\t",p->data);             p=p->prev;                          }                                       
*/                                          
}                                           //头删                                      
Doublelink head_delete(Doublelink head)     
{                                           //判断链表是否为空                      if(NULL==head)                          {                                       return head;                        }                                       //链表存在多个节点                      Doublelink del=head;                    head=head->next;                        free(del);                              del=NULL;                               return head;                            
}                                           //尾插                                                   
Doublelink tail_insert(Doublelink head,datatype element) 
{                                                        Doublelink s=Create_node();                          s->data=element;                                     //链表为空                                           if(NULL==head)                                       {                                                    head=s;                                          return head;                                     }                                                    //链表节点个数>=1                                    Doublelink p=head;                                   while(p->next!=NULL)                                 {                                                    p=p->next;                                       }                                                    p->next=s;                                           s->prev=p;                                           return head;                                         
}                                                        //尾删                                   
Doublelink tail_delete(Doublelink head)  
{                                        if(NULL==head)                       {                                    return head;                     }                                    Doublelink p=head;                   while(p->next!=NULL)                 {                                    p=p->next;                       }                                    if(p->prev!=NULL)                {                                p->prev->next=NULL;          }                                free(p);                     p=NULL;                      return head;                         
}                                        

双向循环链表的头插,头删,尾插,尾删

head.h

#ifndef __HEAD_H__                                        
#define __HEAD_H__                                        
#include <stdio.h>                                        
#include <string.h>                                       
#include <stdlib.h>                                       typedef char datatype;                                    
typedef struct node                                       
{                                                         datatype data;                                        struct node* next;                                    struct node* prev;                                    
}*Doublelink;                                             Doublelink Create_node();                                 Doublelink insert(Doublelink head,datatype element);      void show(Doublelink head);                               Doublelink head_delete(Doublelink head);                  Doublelink tail_insert(Doublelink head,datatype element); Doublelink tail_delete(Doublelink head);                  #endif                                                    

test.c

#include"head.h"                                     
int main(int argc, const char *argv[])               
{                                                    Doublelink head=NULL;                            int n;                                           datatype element;                                printf("请输入要插入数据的个数:");              scanf("%d",&n);                                  for(int i=0;i<n;i++)                             {                                                printf("请输入插入的数据:");                //  scanf(" %c",&element);                       getchar();                                   element=getchar();                           head=insert(head,element);//头插             }                                                head=head_delete(head);  //头删              show(head);  //遍历                              printf("请输入尾插插入的个数:");                scanf("%d",&n);                                  for(int i=0;i<n;i++)                             {                                                printf("请输入插入的数据:");                //  scanf(" %c",&element);                       getchar();                                   element=getchar();                           head=tail_insert(head,element);//尾插        }                                                head=tail_delete(head);                          show(head);                                      return 0;                                        
}                                                    

main.c

#include"head.h"                                          Doublelink Create_node()                                  
{                                                         Doublelink s=(Doublelink)malloc(sizeof(struct node)); if(NULL==s)                                           return NULL;                                      s->data=0;                                            s->next=s->prev=s;                                    return s;                                             
}                                                         //头插                                                    
Doublelink insert(Doublelink head,datatype element)       
{                                                         //创建节点                                            Doublelink s=Create_node();                           s->data=element;                                      //链表为空链表                                        if(NULL==head)                                        {                                                     head=s;                                           }                                                     //链表节点数>=1                                       else                                                  {                                                     Doublelink real=head->prev;                       s->next=head;                                     head->prev=s;                                     head=s;                                           real->next=head;                                  head->prev=real;                                  }                                                     return head;                                          
}                                                         
//遍历                               
void show(Doublelink head)           
{                                    if(NULL==head)                   {                                return;                      }                                //正向遍历                       Doublelink p=head;               while(p->next!=head)             {                                printf("%c\t",p->data);      p=p->next;                   }                                printf("%c\n",p->data);          
}
//头删                                 
Doublelink head_delete(Doublelink head)
{                                      //判断链表是否为空                 if(NULL==head)                     {                                  return head;                   }                                  //链表存在多个节点                 Doublelink p=head;                 //找到最后一个节点的位置           while(p->next!=head)               {                                  p=p->next;                     }                                  Doublelink del=head;               head=head->next;                   //连接头尾,让链表重新循环     p->next=head;                      head->prev=p;                      free(del);                         del=NULL;                          return head;                       
}                                      
//尾插                                                       
Doublelink tail_insert(Doublelink head,datatype element)     
{                                                            //创建节点                                               Doublelink s=Create_node();                              s->data=element;                                         //链表为空                                               if(NULL==head)                                           {                                                        head=s;                                              return head;                                         }                                                        //链表节点个数>=1                                        Doublelink p=head;                                       while(p->next!=head)                                     {                                                        p=p->next;                                           }                                                        p->next=s;                                               //连接表头和表尾                                         s->next=head;                                            head->prev=s;                                            return head;                                             
}                                                            
//尾删                                     
Doublelink tail_delete(Doublelink head)    
{                                          //判断链表是否为空                     if(NULL==head)                         {                                      return head;                       }                                      Doublelink p=head;                     p=head->prev;                          //如果链表只有一个节点                 if(head->next==head)                   {                                      free(p);                           return NULL;                       }                                      //删除尾节点                           p->prev->next=head;                head->prev=p->prev;                free(p);                           p=NULL;                            return head;                           
}                                          

相关文章:

数据结构--双向链表,双向循环链表

双向链表的头插&#xff0c;尾插&#xff0c;头删&#xff0c;尾删 头文件&#xff1a;&#xff08;head.h&#xff09; #include <string.h> #include <stdlib.h> typedef…...

Qt学习(六) 软件启动界面 ,注册表使用 ,QT绘图, 视图和窗口绘图,Graphics View绘图框架:简易CAD

一 软件启动界面 注册表使用 知识点1&#xff1a;这样创建的界面是不可以拖动的&#xff0c;需要手动创建函数来进行拖动&#xff0c;以下的3个函数是从父类继承过来的函数 virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *eve…...

java练习(36)

ps:题目来自力扣 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分字符串。 class Solution {publ…...

go 网络编程 websocket gorilla/websocket

在 Go 语言中&#xff0c;你可以使用标准库中的 net/http 包和第三方库 gorilla/websocket 来实现一个 WebSocket 服务器。gorilla/websocket 库提供了对 WebSocket 协议的高级抽象&#xff0c;使得处理 WebSocket 连接变得相对简单。 package mainimport ("fmt"&qu…...

deepseek与其他大模型配合组合

DeepSeek与其他大模型的配合组合&#xff0c;展现了其在多个领域中的强大应用潜力和灵活性。以下是对DeepSeek与其他大模型配合组合的详细分析&#xff1a; 一、DeepSeek与华知大模型的组合 背景介绍&#xff1a; 华知大模型是同方知网与华为联手打造的&#xff0c;具备全学科…...

【Linux网络编程】IP协议格式,解包步骤

目录 解析步骤 1.版本字段&#xff08;大小&#xff1a;4比特位&#xff09; 2.首部长度&#xff08;大小&#xff1a;4比特位&#xff09;&#xff08;单位&#xff1a;4字节&#xff09; &#x1f35c;细节解释&#xff1a; 3.服务类型&#xff08;大小&#xff1a;8比特…...

Unity 位图字体

下载Bitmap Font Generator BMFont - AngelCode.com 解压后不用安装直接双击使用 提前设置 1、设置Bit depth为32 Options->Export options 2、清空所选字符 因为我们将在后边导入需要的字符。 Edit->Select all chars 先选择所有字符 Edit->Clear all chars i…...

Linux 网络与常用操作(适合开发/运维/网络工程师)

目录 OSI 七层协议简介 应用层 传输层 Linux 命令&#xff01;&#xff01;&#xff01; 1. ifconfig 命令 简介 1. 查看网络地址信息 2. 指定开启、或者关闭网卡 3. 修改、设置 IP 地址 4. 修改机器的 MAC 地址信息 5. 永久修改网络设备信息 2. route 路由命令 …...

指定定网卡名称

一、PCIe网卡名称指定 原理&#xff1a;利用udev规则匹配PCIe设备的硬件特征&#xff08;如总线位置、MAC地址等&#xff09;&#xff0c;覆盖默认命名规则 4 。 步骤&#xff1a; 获取设备信息&#xff1a; Bash udevadm info -a -p /sys/class/net/<原设备名> # 如e…...

linux 安装启动zookeeper全过程及遇到的坑

1、下载安装zookeeper 参考文章&#xff1a;https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法&#xff1a;参考&#xf…...

RD-搭建测试环境

测试团队职责 环境验证&#xff1a;确保开发部署的测试环境可访问&#xff0c;页面/接口无阻塞问题&#xff1b; 配置检查**&#xff1a;核对数据库连接、接口域名、HT证书等关键配置&#xff1b; 数据准备**&#xff1a;导入基线数据&#xff0c;隔离测试与生产数据&#xff1…...

MySQL数据库——表的约束

1.空属性&#xff08;null/not null&#xff09; 两个值&#xff1a;null&#xff08;默认的&#xff09;和not null&#xff08;不为空&#xff09; 数据库默认字段基本都是字段为空&#xff0c;但是实际开发时&#xff0c;尽可能保证字段不为空&#xff0c;因为数据为空没办法…...

ArcGIS Pro进行坡度与坡向分析

在地理信息系统中&#xff0c;坡度分析是一项至关重要的空间分析方法&#xff0c;旨在精确计算地表或地形的坡度&#xff0c;为地形特征识别、土地资源规划、环境保护、灾害预警等领域提供科学依据。本文将详细介绍如何利用ArcGIS Pro这一强大的地理信息系统软件&#xff0c;进…...

【MySQL常见疑难杂症】MySQL数据库底层图例

● Connectors&#xff08;连接者&#xff09;​&#xff1a;指的是不同语言中与SQL的交互&#xff0c;从图3-1中可以看到目前流行的语言都支持MySQL客户端连接。 ● Connection Pool&#xff08;连接池&#xff09;​&#xff1a;管理缓冲用户连接、线程处理等需要缓存的需求。…...

nats集群搭建

本次使用三台机器搭建nats集群&#xff0c;ip分别为192.168.20.7、192.168.20.8、192.168.20.10&#xff0c;预先在三台机器上装好nats&#xff0c;版本为0.0.35。 1. 在192.168.20.7机器上操作&#xff0c;配置server.conf # 为节点设置唯一的名称 server_name: node1 port: …...

谈谈对线程的认识

面对这样的一个多核CPU时代, 实现并发编程是刚需. 多进程实现并发编程, 效果是特别理想的. 但是, 多线程编程模型有一个明显的缺点, 就是进程太重了, 效率不高. 创建一个进程, 消耗时间比较多. 销毁一个进程, 消耗时间也比较多. 调度一个进程, 消耗时间也比较多. 这里的时…...

Vue 和 React 响应式的区别

React 和 Vue 在响应式机制上的核心区别主要体现在数据变化侦测方式、更新触发逻辑和设计理念上&#xff0c;具体如下&#xff1a; 一、数据变化侦测方式 Vue 的响应式 原理&#xff1a;通过 Proxy&#xff08;Vue3&#xff09;或 Object.defineProperty&#xff08;Vue2&#…...

无人机遥控器接口作用详解!

USB接口&#xff1a; 功能&#xff1a;USB接口是一种通用串行总线接口&#xff0c;用于连接外部设备&#xff0c;如手机、平板、电脑或充电设备。在无人机遥控器上&#xff0c;USB接口通常用于数据传输和充电。 应用&#xff1a;用户可以通过USB接口将遥控器与电脑连接&#…...

【数据分析】1 认识数据分析

一、课程核心内容结构 1. 课程定位 商业数据分析导论课&#xff1a;旨在为初学者奠定扎实的基础&#xff0c;介绍数据分析的基本概念、方法和应用场景。后续模块&#xff1a;包括职业发展路径、技能要求等深入内容&#xff0c;帮助学习者规划未来的职业道路。目标群体&#x…...

ASP.NET Core 简单文件上传

使用异步 JavaScript 和 XML&#xff08;AJAX&#xff09;进行简单的文件上传&#xff1b;用 C# 编写的服务器端代码。 使用AJAX和ASP.NET Core MVC上传文件再简单不过了。这不依赖于jQuery。此代码允许上传多个文件&#xff0c;并与 .NET Core 3.1、.NET 6和.NET 8兼容。 如果…...

策略模式Spring框架下开发实例

策略类Spring框架下开发实例 先列出策略模式下需要那些类: 策略接口 (Strategy)&#xff0c;定义所有策略类必须遵循的行为。 具体策略类&#xff08;如 ConcreteStrategyA、ConcreteStrategyB&#xff09;&#xff0c;实现不同的算法或行为。 上下文类 (Context)&#xff0c;…...

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…...

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型&#xff08;14B、32B&#xff09;全过程与测试结果。 NPU&#xff1a;910B3 (65GB) * 8 &#xff08;910B 有三个版本 910B1、2、3&#xff09; 模型&#xff1a;DeepSeek-R1-Distill-Qwen-14B、DeepSeek…...

pyscenic运行报错:ValueError: Intersection of gene_names and tf_names is empty

pyscenic运行报错&#xff1a;ValueError: Intersection of gene_names and tf_names is empty 首先查一下是否有重复基因 python check_common_genes.pycheck_common_genes.py import pandas as pd# 定义文件路径 #这是转置后的基因表达矩阵 expression_matrix_file "…...

Selenium实战案例2:东方财富网股吧评论爬取

上一篇文章&#xff0c;我们使用Selenium完成了网页内文件的自动下载,本文我们将使用Selenium来爬取东方财富网股吧内笔记的评论数据。 网页内容分析 网页内容的分析是web自动化中的关键一步。通过分析网页结构&#xff0c;我们可以确定需要抓取的数据位置以及操作元素的方式。…...

python的多线程机制和构造

Python的多线程机制和构造是一个复杂且多方面的主题&#xff0c;涉及到线程的基本概念、实现方式、同步机制以及实际应用。以下将详细介绍Python中的多线程机制和构造。 1. 线程的基本概念 线程是进程内的执行单元&#xff0c;每个线程共享进程的地址空间和资源。一个进程至少…...

webmin配置终端显示样式,模仿UbuntuDesktop终端

webmin配置终端显示样式&#xff0c;模仿UbuntuDesktop终端 在webmin中&#xff0c;默认情况下是没有图形化桌面的&#xff0c;因此终端界面也不会像 Ubuntu Desktop 那样有预设的紫色背景和颜色主题。不过&#xff0c;你可以通过修改 ~/.bashrc 文件&#xff0c;并结合安装和…...

移动通信发展史

概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通&#xff1a;成立于 2000 年…...

OutOfMemoryError unable to create new native thread

现象 生产环境大量的报OutOfMemoryError: unable to create new native thread Caused by: java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method) [na:1.8.0_291]at java.lang.Thread.start(Thread.java:717) [na:1.8.…...

探索无网用Deepseek+qwen来助力Solidworks二次开发

在本教程中&#xff0c;我们将详细介绍如何在本地环境中使用 DeepSeek 和 Qwen 模型&#xff0c;结合 AnythingLLM&#xff0c;构建一个用于 SolidWorks 二次开发的私有化智能知识库。 目录 前言 环境准备 2.1 安装 Ollama 2.2 安装 Docker Desktop DeepSeek 本地部署 3.1…...