双链表的基本运算

2024-05-10 22:58
文章标签 基本 运算 双链

本文主要是介绍双链表的基本运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码:


#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct DNode
{ElemType data;struct DNode *prior;struct DNode *next;
}DLinkList;
//初始化
void InitList(DLinkList * &L)
{L=(DLinkList *)malloc(sizeof(DLinkList));L->prior=L->next=NULL;
}
//销毁双链表
void DestroyList(DLinkList *L)
{DLinkList *p=L,*q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);
}
//判断链表是否为空
bool ListEmpty(DLinkList *L)
{return(L->next==NULL);
}
//双链表的长度
int ListLength(DLinkList *L)
{DLinkList *p=L;int i=0;while(p->next!=NULL){i++;p=p->next;}return i;
}
//输出双链表
void DispList(DLinkList *L)
{DLinkList *p=L->next;while(p!=NULL){printf(" %c ",p->data);p=p->next;}printf("\n");
}
//求双链表中的某个元素的值
bool GetElem(DLinkList *L,int i,ElemType &e)
{int j=0;DLinkList *p=L;while(j<i && p!=NULL){j++;p=p->next;}if(p==NULL)return false;else{e=p->data;return true;}}
//按元素值查找
int LocateElem(DLinkList *L,ElemType e)
{int n=1;DLinkList *p=L->next;while(p!=NULL && p->data!=e){n++;p=p->next;}if(p==NULL)return 0;elsereturn n;
}
//插入元素
bool ListInsert(DLinkList * &L,int i,ElemType e)
{int j=0;DLinkList *p=L,*s;while(j<i-1 && p!=NULL){j++;p=p->next;}if(p==NULL)return false;else{s=(DLinkList *)malloc(sizeof(DLinkList));s->data=e;s->next=p->next;if(p->next!=NULL)p->next->prior=s;s->prior=p;p->next=s;return true;}
}
//删除数据元素
bool ListDelete(DLinkList * &L,int i,ElemType &e)
{int j=0;DLinkList *p=L,*q;while(j<i-1 && p!=NULL){j++;p=p->next;}if(p==NULL)return false;else{q=p->next;if(q==NULL)return false;e=q->data;p->next=q->next;if(p->next!=NULL)p->next->prior=p;free(q);return true;}
}
void main()
{DLinkList *h;ElemType e;printf("双链表的基本运算如下:\n");printf(" (1)初始化双链表h\n");InitList(h);printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(h,1,'a');ListInsert(h,2,'b');ListInsert(h,3,'c');ListInsert(h,4,'d');ListInsert(h,5,'e');printf(" (3)输出双链表h:");DispList(h);printf(" (4)双链表的长度=%d\n",ListLength(h));printf(" (5)双链表h为%s\n",(ListLength(h)?"空":"非空"));GetElem(h,3,e);printf(" (6)双链表h的第三个元素=%c\n",e);printf(" (7)元素a的位置=%d\n",LocateElem(h,'a'));printf(" (8)在第四个元素上插入f元素\n");ListInsert(h,4,'f');printf(" (9)输出双链表h:");DispList(h);printf(" (10)删除h的第三个元素\n");ListDelete(h,3,e);printf(" (11)输出双链表h:");DispList(h);printf(" (12)释放双链表h\n");DestroyList(h);
}

运行结果:


这篇关于双链表的基本运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977804

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前,不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础,因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示,很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间的互相转换。 十进制转二进制 十进制转二进制可以使用常见的 除2取余法 进行。每次将十进制除以2并记录所得余数,直到商为0,然后再将记录的余数 从下往上排列即