C语言实现循环双链表

在C语言中,实现一个循环双链表需要定义一个节点结构体,这个结构体包含三个字段:数据字段,指向前一个节点的指针,以及指向下一个节点的指针。定义节点结构体:

1)定义节点结构体:

typedef struct Node {  int data;  struct Node* prev;  struct Node* next;  
} Node;

2)创建节点:创建一个新节点并初始化它的数据和指针。

Node* createNode(int data) {  Node* newNode = (Node*)malloc(sizeof(Node));  if (!newNode) {  printf("Memory error\n");  return NULL;  }  newNode->data = data;  newNode->next = NULL;  newNode->prev = NULL;  return newNode;  
}

3)插入节点:在链表的末尾添加一个新节点。需要考虑的是如何更新新节点和前一个节点的指针。

void insertNode(Node** head, int data) {  Node* newNode = createNode(data);  if (*head == NULL) { // 如果链表为空,新节点就是头节点  *head = newNode;  newNode->next = newNode;  newNode->prev = newNode;  } else { // 否则,将新节点添加到链表的末尾  Node* curr = *head;  while (curr->next != *head) { // 找到链表的末尾  curr = curr->next;  }  curr->next = newNode; // 更新末尾节点的next指针  newNode->prev = curr; // 更新新节点的prev指针  newNode->next = *head; // 新节点的next指针指向头节点  (*head)->prev = newNode; // 更新头节点的prev指针指向新节点  }  
}

 4)删除节点:删除一个指定的节点。需要考虑的是如何更新被删除节点的前后节点的指针,以及如何处理被删除节点是头节点的情况。

void deleteNode(Node** head, int data) {  Node* curr = *head;  if (*head == NULL) { // 如果链表为空,直接返回  return;  }  if (curr->data == data) { // 如果头节点就是要删除的节点  Node* temp = *head;  *head = (*head)->next; // 将头节点的next指针作为新的头节点  (*head)->prev = *head; // 新的头节点的prev指针指向自己  free(temp); // 释放旧的头节点内存空间  return;  }  while (curr->data != data) { // 找到要删除的节点  curr = curr->next;  if (curr == *head) { // 如果链表中没有找到要删除的节点,直接返回  return;  }  }  Node* temp = curr; // 保存要删除的节点的指针  curr = curr->next; // 将要删除节点的next指针作为当前节点  curr->prev = temp->prev; // 更新当前节点的prev指针指向要删除节点的prev指针所指向的节点  temp->prev->next = curr; // 更新要删除节点的prev指针所指向的节点的next指针指向当前节点  free(temp); // 释放要删除的节点的内存空间  
}

 5)打印链表:遍历链表并打印每个节点的数据。

void printList(Node* head) {  if (head == NULL) { // 如果链表为空,直接返回  printf("List is empty.\n");  return;  }  Node* curr = head; // 从头节点开始遍历链表  do { // 使用do-while循环,保证至少打印一次头节点的数据值,即使链表只有一个节点。注意使用前置++运算符。  printf("%d ", curr->data); // 打印当前节点的数据值,注意没有换行。使用后置++运算符。    } while ((curr = curr->next) != head); // 移动到下一个节点,如果当前节点是头节点,结束循环。注意使用前置++运算符。    printf("\n"); // 在打印完最后一个数据值后换行。 

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

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

相关文章

解锁学习新方式——助您迈向成功之路

近年来,随着吉林开放大学广播电视大学的崛起,越来越多的学子选择这所优秀的学府来实现自己的梦想。而作为一名学者,我有幸见证了电大搜题微信公众号的诞生,为广大学子提供了一个全新的学习支持平台。 电大搜题微信公众号&#xff…

《深度学习工业缺陷检测》专栏介绍 CSDN独家改进实战

💡💡💡深度学习工业缺陷检测 1)提供工业小缺陷检测性能提升方案,满足部署条件; 2)针对缺陷样品少等难点,引入无监督检测; 3)深度学习 C、C#部署方案&#…

2023工博会强势回归!智微工业携八大系列重磅亮相

中国国际工业博览会(简称"中国工博会")自1999年创办以来,历经二十余年发展创新,通过专业化、市场化、国际化、品牌化运作,已发展成为通过国际展览业协会(UFI)认证、中国工业领域规模最…

示例-安装office2016图文教程简体中文下载安装包

目录 简介 步骤 总结 简介 Office 2016作为一款办公软件套件,下载和安装 都具有许多令人印象深刻的特点。让我来为你介绍一下:Office 2016注重实现跨平台的一致性。无论你是在Windows、Mac、iOS还是Android上使用Office,你都可以享受到相似…

Python中如何判断列表中的元素,是否在一段文本中??

#我的Python教程 #官方微信公众号:wdPython1.要判断列表中的每个元素是否在一段文本中,可以使用Python中的字符串的 in 运算符来实现。以下是一个示例代码: text "Hello, how are you today?" word_list ["Hello", &…

数据集成:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

Discuz论坛网站标题栏Powered by Discuz!版权信息如何去除或是修改?

当我们搭建好DZ论坛网站后,为了美化网站,想把标题栏的Powered by Discuz!去除或是修改,应该如何操作呢?今天飞飞和你分享,在操作前务必把网站源码和数据库都备份到本地或是网盘。 Discuz的版权信息存在两处…

多模块和分布式项目

一、什么是多模块项目 多模块项目是一种软件项目组织结构,其中一个大型项目被分成多个独立的子模块或子项目。每个子模块通常具有自己的功能、目录结构和开发周期,但它们可以协同工作以构建一个完整的应用程序。这种项目结构有助于提高代码的可维护性、…

【李沐深度学习笔记】矩阵计算(5)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。 本节是第五篇,由于CSDN限制,只能被迫拆分 矩阵计算 多元函数的等高线 此处参考视频:熟肉)多元…

go学习-GMP模型

GMP 好理解还是 GPM 好理解? 按照上述图,从上往下,GPM更适合理解 GMP 模型: Go 语言运行时系统中的 Goroutine、用于管理 Goroutine 调度的 Go Scheduler(P)、机器可用的逻辑处理器数量(M&#…

ChatGPT使用技巧整理

目录 1. 让ChatGPT扮演专家角色2. 告诉ChatGPT你的身份3. 限制ChatGPT的回答长度4. 让ChatGPT一步步思考5. 明确你的要求和目的6. 提供充分的背景信息7. 始终结构化思考你的prompt1. 让ChatGPT扮演专家角色 当你们讨论的是市场营销问题时,你可以要求ChatGPT扮演一个具有20年从…

[golang gui]fyne框架代码示例

1、下载GO Go语言中文网 golang安装包 - 阿里镜像站(镜像站使用方法:查找最新非rc版本的golang安装包) golang安装包 - 中科大镜像站 go二进制文件下载 - 南京大学开源镜像站 Go语言官网(Google中国) Go语言官网(Go团队) 截至目前(2023年9月17日&#x…

面试题库(一):数据结构和算法

链表 链表,常见的面试题有写一个链表中删除一个节点的算法、单链表倒转、两个链表找相交的部分,这个一般必须得完全无误的情况下写出来;给出两个链表的头结点,找出这两个链表的交点。java 中数组和链表的区别,各自优势 如何设计拥有高效的随机读取能力的的链表(跳表) 设…

【字符串】后缀数组

参考文章&#xff1a; 数据结构 —— 字符串&#xff1a;后缀数组_Jetiaime的博客-CSDN博客&#xff08;算法代码&#xff09; 后缀数组_KonjakLAF的博客-CSDN博客&#xff08;应用例题&#xff09; 板子&#xff1a; #include<bits/stdc.h> using namespace std; ty…

【数据分享】2005-2022年全国民航机场客货吞吐量和起降架次数据

机场是一个城市对外联系的重要渠道&#xff0c;机场的旅客吞吐量和货物吞吐量是体现一个城市对外联系程度的重要指标。 本次我们给大家分享的是2005-2022年我国民航机场的旅客吞吐量、货邮吞吐量、起降架次数据。数据格式为Excel和Shp两种格式。数据坐标为WGS1984。原始数据来…

MySQL常考知识点

MySQL常考知识点 索引的基本原理索引设计的原则事务的基本特性和隔离级别什么是MVCC简述MyISAM和InnoDB的区别Explain语句结果中各个字段分表表示什么索引覆盖是什么最左前缀原则是什么B树和B树的区别&#xff0c;为什么Mysql使⽤B树Mysql锁有哪些&#xff0c;如何理解Mysql慢查…

腾讯面试题:无网络环境,如何部署Docker镜像?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;很高兴再次和大家见面。今天&#xff0c;我要和大家聊聊一个特别有趣的话题——腾讯面试题&#xff1a;无网络环境&#xff0c;如何部署Docker镜像&#xff1f;这可是一个技术含量颇高的问题哦&#xff01;废…

nodejs 如何在npm发布自己的包 <记录>

一、包结构 必要结构&#xff1a; 一个包对应一个文件夹&#xff08;文件夹名不是包名&#xff0c;但最好与包名保持一致&#xff0c;包名以package.json中的name为主&#xff09;包的入口文件index.js包的配置文件package.json包的说明文档README.md 二、需要说明的文件 1.配…

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道&#xff0c;二维卷积运算示例 单通道&#xff0c;二维&#xff0c;带偏置的卷积示例 带填充的单通道&#xff0c;二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…

软件测试的理论基础1

软件的生命周期 可行性研究和计划&#xff08;立项&#xff09; 需求分析 概要设计&#xff08;测试计划&#xff09; 详细设计&#xff08;测试方案&#xff09; 实现&#xff08;开发阶段&#xff1b;包含单元测试&#xff09; 组装测试&#xff08;集成测试&#xff09; 确…