【数据结构】 双链表的基本操作 (C语言版)

目录

一、双链表

1、双链表的定义:

2、双链表表的优缺点: 

二、双链表的基本操作算法(C语言)

 1、宏定义

 2、创建结构体

3、双链表的初始化 

4、双链表表插入

5、双链表的查找

6、双链表的取值

7、求双链表长度

8、双链表的删除

9、双链表的清空

10、双链表的销毁

11、输出链表元素

三、双链表的全部代码(C语言)

四、运行结果


一、双链表

1、双链表的定义:

双链表也叫双向链表,是一种链表数据结构。它的每个数据结点包含两个指针,一个指向前一个结点,另一个指向后一个结点。这意味着从双向链表的任何节点都可以方便地访问其前驱或后继节点。通常,我们构造双向循环链表,它的特点是尾节点的指针域指向头结点,整个链表形成一个环。

 

2、双链表表的优缺点: 

双链表的优点:

  1. 可以方便地访问前驱和后继节点,既可以向前也可以向后遍历链表。
  2. 在某些情况下,双链表比单链表更节省空间,因为它不需要额外的指针来存储前驱和后继节点的信息。

双链表的缺点:

  1. 插入和删除节点相对复杂,需要更多的时间来调整指针。
  2. 双链表需要更多的存储空间,因为每个节点都需要额外的指针来存储前驱和后继节点的信息。

二、双链表的基本操作算法(C语言)

 1、宏定义
#define OK 1
#define ERROR 0typedef char ElemType;
typedef int Status;
 2、创建结构体
typedef struct DuLNode {ElemType data;struct DuLNode *prior;struct DuLNode *next;
} DuLNode, *DuLinkList;
3、双链表的初始化 
//双链表初始化
Status DInitList(DuLinkList &head) {head = new DuLNode;head->prior = NULL;head->next = NULL;return OK;
}
4、双链表表插入
//插入
Status DListInsert(DuLinkList &head, int i, ElemType e) {DuLinkList p = head;int j = 0;while (p && (j < i - 1)) {p = p->next;++j;}if (!p || j > i - 1) {return ERROR;}DuLNode *s = new DuLNode;s->data = e;s->next = p->next;if(p->next != NULL){p->next->prior = s;	}p->next = s;s->prior = p;return OK;
}
5、双链表的查找

//查找
int DLocateLinkListElem(DuLinkList head, ElemType e) {DuLinkList p = head->next;int j = 1;while (p && (p->data != e)) {p = p->next;j++;}if (p == NULL) { return 0;}return j;
}
6、双链表的取值
//取值
Status DGetLinkList(DuLinkList head, int i, ElemType &e) {DuLinkList p = head->next;int j = 1;while (p && j < i) {p = p->next;++j;}if (p == NULL) {return ERROR;}e = p->data;return OK;
}
7、求双链表长度
//求双链表长度
Status DGetLinkListLength(DuLinkList head) {DuLinkList p = head->next;int length = 0;while (p!=NULL) {            //单链表不为空表时length++;p = p->next;}return length;
}
8、双链表的删除
//删除
Status DListDelete(DuLinkList &head, int i, ElemType &e) {DuLinkList p = head;int j = 0;while (p && j < i - 1) {p = p->next;j++;}if (!p) {return ERROR;}DuLinkList q = p->next;e = q->data;p->next = q->next;if(q->next != NULL){q->next->prior=p;}delete q;return OK;
}
9、双链表的清空
//清空
Status DClearLinkList(DuLinkList &head) {DuLinkList p = head->next;DuLinkList q;while (p) {q = p;p = p->next;delete q;}head->next = NULL;return OK;
}
10、双链表的销毁
//销毁
Status DestoryDLinkList(DuLinkList &head) {DuLinkList p;while (head) {p = head;head = head->next;delete p;}return OK;
}
11、输出链表元素
//输出链表元素
void DprintLinkList(DuLinkList head) {DuLinkList p = head->next;while (p) {printf("%c", p->data);p = p->next;}printf("\n");
}

三、双链表的全部代码(C语言)

#include <stdio.h>#define OK 1
#define ERROR 0typedef char ElemType;
typedef int Status;typedef struct DuLNode {ElemType data;struct DuLNode *prior;struct DuLNode *next;
} DuLNode, *DuLinkList;//双链表初始化
Status DInitList(DuLinkList &head) {head = new DuLNode;head->prior = NULL;head->next = NULL;return OK;
}//功能菜单
int choice() {printf("==================================\n");printf("         双链表操作功能菜单        \n");printf("1、插入元素  2、查询表长  3、按位查找\n");printf("4、按值查找  5、删除元素  6、销毁链表\n");printf("7、清空链表  8、批量插入  9、链表元素\n");printf("==================================\n");return 0;
}//插入
Status DListInsert(DuLinkList &head, int i, ElemType e) {DuLinkList p = head;int j = 0;while (p && (j < i - 1)) {p = p->next;++j;}if (!p || j > i - 1) {return ERROR;}DuLNode *s = new DuLNode;s->data = e;s->next = p->next;if(p->next != NULL){p->next->prior = s;	}p->next = s;s->prior = p;return OK;
}//查找
int DLocateLinkListElem(DuLinkList head, ElemType e) {DuLinkList p = head->next;int j = 1;while (p && (p->data != e)) {p = p->next;j++;}if (p == NULL) { return 0;}return j;
}//取值
Status DGetLinkList(DuLinkList head, int i, ElemType &e) {DuLinkList p = head->next;int j = 1;while (p && j < i) {p = p->next;++j;}if (p == NULL) {return ERROR;}e = p->data;return OK;
}//求双链表长度
Status DGetLinkListLength(DuLinkList head) {DuLinkList p = head->next;int length = 0;while (p!=NULL) {            //单链表不为空表时length++;p = p->next;}return length;
}//删除
Status DListDelete(DuLinkList &head, int i, ElemType &e) {DuLinkList p = head;int j = 0;while (p && j < i - 1) {p = p->next;j++;}if (!p) {return ERROR;}DuLinkList q = p->next;e = q->data;p->next = q->next;if(q->next != NULL){q->next->prior=p;}delete q;return OK;
}//清空
Status DClearLinkList(DuLinkList &head) {DuLinkList p = head->next;DuLinkList q;while (p) {q = p;p = p->next;delete q;}head->next = NULL;return OK;
}//销毁
Status DestoryDLinkList(DuLinkList &head) {DuLinkList p;while (head) {p = head;head = head->next;delete p;}return OK;
}//输出链表元素
void DprintLinkList(DuLinkList head) {DuLinkList p = head->next;while (p) {printf("%c", p->data);p = p->next;}printf("\n");
}int main() {DuLinkList Dlist;printf("双链表正在初始化....\n");int InitStatus = DInitList(Dlist);if (InitStatus == OK) {printf("双链表初始化成功!\n");} else {printf("双链表初始化失败!\n");}choice();while (1) {int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {//通过开关进行功能选择case 1: {//插入元素//ListInsert_Dul(Dlist,1,'a');int insertIndex;ElemType inserElem;printf("请输入插入元素位置及插入元素(请在英文状态下输入例如:1,a): \n");scanf("%d,%c", &insertIndex, &inserElem);Status InsertS = DListInsert(Dlist, insertIndex, inserElem);if (InsertS == OK) {printf("向双链表%d个位置,插入元素为%c成功!\n\n", insertIndex, inserElem);} else {printf("向双链表插入元素失败!\n\n");}}break;case 2: {//求单链表的长度int length = DGetLinkListLength(Dlist);printf("循环双链表的长度为:%d。 \n\n", length);}break;case 3: {//取值Status GetIndex;printf("请输入需要查询的元素的位置:\n");scanf("%d", &GetIndex);ElemType GetElem;int GetStatus = DGetLinkList(Dlist, GetIndex, GetElem);if (GetStatus == OK) {printf("从单链表中获取第%d位置元素成功,所获取到的元素为:%c。\n\n", GetIndex, GetElem);} else {printf("从单链表中获取第%d位置元素失败!\n\n", GetIndex);}}break;case 4: {//查找ElemType LocateElem;printf("请输入想要查找元素:\n");getchar();    //用于接收回车scanf("%c", &LocateElem);Status LocateIndex = DLocateLinkListElem(Dlist, LocateElem);if (LocateIndex > 0) {printf("从双链表中查找元素%c成功,它在循环链表中的位置为第%d个!\n\n", LocateElem, LocateIndex);} else {printf("从双链表中查找元素%c失败!\n\n", LocateElem);}}break;case 5: {//删除//ListDelete_DuL(list,1);Status DeleteIndex;printf("请输入想要删除元素的位置:\n");scanf("%d", &DeleteIndex);ElemType DeleteElem;ElemType DeleteStatus = DListDelete(Dlist, DeleteIndex, DeleteElem);if (DeleteStatus == OK) {printf("删除双链表第%d个位置的元素成功,删除的元素为:%c。\n\n", DeleteIndex, DeleteElem);} else {printf("删除双链表第%d个位置的元素失败!\n\n", DeleteIndex);}}break;case 6: {//销毁Status DestoryStatus = DestoryDLinkList(Dlist);if (DestoryStatus == OK) {printf("双环链表销毁成功!\n\n");} else {printf("双链表销毁失败!\n\n");}}break;case 7: {//清空Status ClearStatus = DClearLinkList(Dlist);if (ClearStatus == OK) {printf("双链表清空成功!\n\n");} else {printf("双链表清空失败!\n\n");}}break;case 8: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);ElemType array[on];for (int i = 1; i <= on; i++) {getchar();printf("向双链表第%d个位置插入元素为:", (i));scanf("%c", &array[i]);}for (int i = 1; i <= on; i++) {Status InsertStatus = DListInsert(Dlist, i, array[i]);if (InsertStatus == OK) {printf("向双链表第%d个位置插入元素%c成功!\n", i, array[i]);} else {printf("向双链表第%d个位置插入元素%c失败!\n", i, array[i]);}}}break;case 9: {//输出链表元素DprintLinkList(Dlist);}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;}

四、运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux shell编程学习笔记41:lsblk命令

边缘计算的挑战和机遇 边缘计算面临着数据安全与隐私保护、网络稳定性等挑战&#xff0c;但同时也带来了更强的实时性和本地处理能力&#xff0c;为企业降低了成本和压力&#xff0c;提高了数据处理效率。因此&#xff0c;边缘计算既带来了挑战也带来了机遇&#xff0c;需要我…

阿里云国外服务器价格购买与使用策略

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

学习笔记-李沐动手学深度学习(二)(08-09、线性回归、优化算法、Softmax回归、损失函数、图片分类)

总结 以_结尾的方法&#xff0c;好像是原位替换&#xff08;即 原地修改&#xff0c;就地修改变量&#xff09;如 fill_() 感恩的心&#xff1a;&#xff08;沐神的直播环境&#xff09; 08-线性回归基础优化算法 引言&#xff08;如何在美国买房&#xff09; 根据现在行…

用ChatGPT教学、科研!亚利桑那州立大学与OpenAI合作

亚利桑那州立大学&#xff08;简称“ASU”&#xff09;在官网宣布与OpenAI达成技术合作。从2024年2月份开始&#xff0c;为所有学生提供ChatGPT企业版访问权限&#xff0c;主要用于学习、课程作业和学术研究等。 为了帮助学生更好地学习ChatGPT和大语言模型产品&#xff0c;AS…

unicloud 云对象 schema

目录 云对象 创建云对象 客户端调用 二、Schema&#xff08;表结构&#xff09; 什么是Schema&#xff1f; 如何编写DB Schema Schema的一级节点 客户端直连数据库 字段属性 字段类型bsonType 默认值defaultValue/forceDefaultValue 云对象 创建云对象 云对象&#…

HarmonyOS鸿蒙应用开发 (一、环境搭建及第一个Hello World)

万事开头难。难在迈出第一步。心无旁骛&#xff0c;万事可破。没有人一开始就能想清楚&#xff0c;只有做起来&#xff0c;目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日&#xff0c;华为目前开启已HarmonyOS NEXT开发者预览版Beta招募&#xff0c;报名周期为1月15…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…

JavaEE中什么是Web容器?

Web容器&#xff08;也称为Servlet引擎&#xff09;是一个用于执行Java Servlet和JSP的服务器端环境。它负责管理和执行在其上运行的Web应用程序。 Tomcat是Web容器 Apache Tomcat 是一个流行的开源的Web容器&#xff0c;它实现了Java Servlet和JavaServer Pages&#xff08;…

【深度学习目标检测】十七、基于深度学习的洋葱检测系统-含GUI和源码(python,yolov8)

使用AI实现洋葱检测对农业具有以下意义&#xff1a; 提高效率&#xff1a;AI技术可以快速、准确地检测出洋葱中的缺陷和问题&#xff0c;从而提高了检测效率&#xff0c;减少了人工检测的时间和人力成本。提高准确性&#xff1a;AI技术通过大量的数据学习和分析&#xff0c;能够…

第五课:MindSpore自动并行

文章目录 第五课&#xff1a;MindSpore自动并行1、学习总结&#xff1a;数据并行模型并行MindSpore算子级并行算子级并行示例 流水线并行GPipe和Micro batch1F1B流水线并行示例 内存优化重计算优化器并行 MindSpore分布式并行模式课程ppt及代码地址 2、学习心得&#xff1a;3、…

如何使用pytorch的Dataset, 来定义自己的Dataset

Dataset与DataLoader的关系 Dataset: 构建一个数据集&#xff0c;其中含有所有的数据样本DataLoader&#xff1a;将构建好的Dataset&#xff0c;通过shuffle、划分batch、多线程num_workers运行的方式&#xff0c;加载到可训练的迭代容器。 import torch from torch.utils.dat…

Qt6入门教程 9:QWidget、QMainWindow和QDialog

目录 一.QWidget 1.窗口和控件 2.事件 二.QMainWindow 三.QDialog 1.模态对话框 1.1模态对话框 1.2.半模态对话框 2.非模态对话框 在用Qt Creator创建Qt Widgets项目时&#xff0c;会默认提供三种基类以供选择&#xff0c;它们分别是QWidget、QMainWIndow和QDialog&am…

SQL 注入总结(详细)

一、前言 这篇文章是最近学习 SQL 注入后的笔记&#xff0c;里面整理了 SQL 常见的注入方式&#xff0c;供大家学习了解 SQL 注入的原理及方法&#xff0c;也方便后续自己回顾&#xff0c;如有什么错误的地方欢迎指出&#xff01; 二、判断注入类型 按照注入点类型分类 数字型…

外贸自建站如何建立?海洋建站的操作指南?

外贸自建站的建站流程什么&#xff1f;做跨境怎么搭建外贸网站&#xff1f; 外贸自建站成为企业开拓国际市场、提升品牌形象的重要途径。然而&#xff0c;对于许多企业而言&#xff0c;如何高效地进行外贸自建站仍然是一个挑战。海洋建站将带您一步步探讨外贸自建站的关键步骤…

计算机网络——面试问题

1 从输⼊ URL 到⻚⾯展示到底发⽣了什么&#xff1f; 1. 先检查浏览器缓存⾥是否有缓存该资源&#xff0c;如果有直接返回&#xff1b;如果没有进⼊下⼀ 步⽹络请求。 2. ⽹络请求前&#xff0c;进⾏ DNS 解析 &#xff0c;以获取请求域名的 IP地址 。 3. 浏览器与服务器…

《WebKit 技术内幕》之七(3): 渲染基础

3 渲染方式 3.1 绘图上下文&#xff08;GraphicsContext&#xff09; 上面介绍了WebKit的内部表示结构&#xff0c;RenderObject对象知道如何绘制自己&#xff0c;但是&#xff0c;问题是RenderObject对象用什么来绘制内容呢&#xff1f;在WebKit中&#xff0c;绘图操作被定…

xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

图标设置 1,根据图片构建各类尺寸的图标2.xcode打开ios文件3.xcode设置图标4.打包提交审核,即可(打包教程可通过我的主页查找) 1,根据图片构建各类尺寸的图标 工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的ios\Runner\Assets.xcassets\AppIcon.ap…

java简单的抽奖工具类(含测试方法)

文章目录 结果代码 结果 代码 import lombok.AllArgsConstructor; import lombok.Data; import lombok.ToString;import java.util.ArrayList; import java.util.List;/****/ public class LotteryUtils {public static void main(String[] args) throws InterruptedException…

PythonNet,Csharp如何白嫖Python生态和使用Matplotlib

文章目录 前言PythonNet环境配置Python环境配置Csharp Nuget配置运行代码测试运行结果 总结 前言 我既然用Csharp去尝试学习机器视觉&#xff0c;我就想试试用Csharp去使用Python的库。 这个世界上有没有编程语言既有Python的开发效率&#xff0c;又有C/C/ PythonNet Pythonne…

Android:JNI实战,加载三方库、编译C/C++

一.概述 Android Jni机制让开发者可以在Java端调用到C/C&#xff0c;也是Android应用开发需要掌握的一项重要的基础技能。 计划分两篇博文讲述Jni实战开发。 本篇主要从项目架构上剖析一个Android App如何通过Jni机制加载三方库和C/C文件。 二.Native C Android Studio可…