数据结构--单链表(c语言实现)

一.单链表的设计

1.单链表的结构定义:
typedef struct Node{int data;//数据域struct Node* next;//后继指针
}Node,*List;
2.单链表的设计示意图:

3.注意,单链表的最后一个节点的next域为NULL;
 
4.为什么要有一个头节点?(简单方便,不用传二级指针);


二.单链表的实现

//初始化
void InitList(List plist)
{assert(plist != NULL);if (plist == NULL)return;//plist->data;//头节点的数据域不使用plist->next = NULL;
}//考试重点
//头插
bool Insert_head(List plist, int val)
{assert(plist != NULL);if (plist == NULL)return false;//动态申请一个节点Node* p = (Node *)malloc(sizeof(Node));assert(p != NULL);//将数据val放入到新节点p->data = val;//插入新节点p->next = plist->next;plist->next = p;return true;
}//考试重点
//尾插
bool Insert_tail(List plist, int val)
{assert(plist != NULL);if (plist == NULL)return false;//申请节点Node* p = (Node*)malloc(sizeof(Node));assert(p != NULL);//将数据val放入到新节点p->data = val;//找尾巴Node* q;for(q=plist;q->next!=NULL;q=q->next){;}//插入新节点p->next = q->next;//p->next=NULL;q->next = p;return true;
}//插入数据,在plist链表的pos位置插入val;
bool Insert(List plist, int pos, int val)
{assert(plist != NULL);if (plist == NULL)return false;if (pos<0 || pos>GetLength(plist)){return false;}Node* p = (Node*)malloc(sizeof(Node));assert(p != NULL);p->data = val;//找到位置Node* q;int i;for (q = plist, i = 0; i < pos; i++, q = q->next){;}// 插入p->next = q->next;q->next = p;return true;
}//判空
bool IsEmpty(List plist)
{assert(plist != NULL);if (plist == NULL)return false;return plist->next == NULL;
}//获取数据节点的个数
int GetLength(List plist)
{assert(plist != NULL);if (plist == NULL)return 0;int count = 0;for (Node* p = plist->next; p!= NULL; p = p->next){count++;}return count;}//在plist中查找第一个key值,找到返回节点地址,没有找到返回NULL;
Node* Search(List plist, int key)
{assert(plist != NULL);if (plist == NULL)return NULL;for (Node* p = plist->next; p != NULL; p = p -> next){if (p->data == key){return p;}}return NULL;
}//删除pos位置的值
bool DelPos(List plist, int pos)
{assert(plist != NULL);if (plist == NULL)return false;if (pos < 0 || pos >= GetLength(plist)){return false;}Node* p;int i;for (p = plist, i = 0; i < pos; i++, p = p->next){;}//删除p后面的节点Node* q = p->next;p->next = q->next;free(q);return true;
}//考试重点
//删除第一个val的值
bool DelVal(List plist, int val)
{Node* p = GetPrio(plist, val);if (p == NULL)return false;Node* q = p->next;//删除qp->next = q->next;//p->next=p->next->next;//释放qfree(q);return true;
}//返回key的前驱地址,如果不存在返回NULL;
Node* GetPrio(List plist, int key)
{for (Node* p = plist; p->next != NULL; p = p->next){if (p->next->data == key)return p;}return NULL;
}//返回key的后继地址,如果不存在返回NULL;
Node* GetNext(List plist, int key)
{assert(plist != NULL);if (plist == NULL)return NULL;Node* p = Search(plist, key);if (p == NULL)return NULL;return p->next;
}//输出
void Show(List plist)
{//注意,头节点不能访问datafor (Node* p = plist->next; p != NULL; p = p->next){printf("%d ", p->data);}printf("\n");
}//清空数据
void Clear(List plist)
{Destroy(plist);
}void Destroy(List plist)
{//总是删除第一个数据节点Node* p;while (plist->next != NULL){p = plist->next;plist->next = p->next;free(p);//error//plist->next = plist->next->next;//free(plist->next);}
}


三.单链表的总结
 

头插,头删 时间复杂度是O(1) 

尾插,尾删 时间复杂度是O(n)


本篇完!

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

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

相关文章

SQL中的UNION和UNION ALL

SQL中的UNION和UNION ALL是用来合并两个或更多SELECT语句结果集的运算符。它们的主要区别在于是否去除重复行以及是否执行排序操作。 UNION&#xff1a; - UNION操作符用于合并两个或多个查询结果集&#xff0c;形成一个新的结果集。 - 它会自动删除结果集中的重复行&#xf…

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…

PTA-练习9

目录 实验10-4 递归实现顺序输出整数 实验10-10 十进制转换二进制 实验10-6 递归求简单交错幂级数的部分和 实验11-1-2 输出月份英文名 实验11-1-6 指定位置输出字符串 实验11-1-8 查找子串 递归的基本思路&#xff1a; 推出递归的条件或者进入递归的条件每层递归需要执行…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接 LEFT JOIN 和右外连…

【Web应用技术基础】CSS(4)——背景样式

第1题&#xff1a;背景颜色 .html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello World</title><link rel"stylesheet" href"step1/CSS/style.css"> </head><body>&…

左侧或水平导航菜单栏与main区域联动

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、左侧导航菜单栏与main区域联动 文章目录 系列文章目录前言一、实现步骤1.<el-menu>中设置属性router为true2.<el-menu-item>中设置路由 route"/"3.<el-main>里设置路由出口4…

MS Edge浏览器坏了?网页播放视频的速度不对

前言 小白是MS Edge浏览器的重度用户。电脑上必须有的两个浏览器&#xff1a;Google Chrome和Microsoft Edge。 前段时间小白在使用MS Edge的时候出了问题&#xff1a;播放视频或者音频的时候总是被莫名其妙加速或者减速&#xff0c;类似于播放视频时候的0.5x或者2.0x。 当时…

红黑树介绍及插入操作的实现

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

ES学习日记(二)-------集群设置

上一节写了elasticsearch单节点安装和配置,现在说集群,简单地说就是在多台服务器上搭建单节点,在配置文件里面增加多个ip地址即可,过程同单节点部署,主要说集群配置 注意:不建议在之前单节点es上修改配置为集群,据说运行之后会生成很多文件,在单点基础上修改容易出现未知问题,…

第四篇:3.3 无效流量(Invalid traffic) - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xff09;第四篇广…

STM32学习笔记(10_2)- I2C通信协议MPU6050简介

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

Base64编码的全面介绍

title: Base64编码的全面介绍 date: 2024/3/31 18:55:49 updated: 2024/3/31 18:55:49 tags: Base64编码网络传输文本转换数据膨胀非加密性质应用场景安全传输 1. Base64的定义和作用 Base64是一种用64个字符表示二进制数据的编码方式&#xff0c;通常用于在网络传输中将二进…

【Vue】动态样式

内联样式的动态样式 body(){ boxASelect:false, } v-bind:style"{borderColor:boxASelect ? red : #ccc}" <body><header><h1>Vue Dynamic Styling</h1></header><section id"styling"><div class"demo&quo…

flutter 修改app名字和图标

一、修改名字 在Android中修改应用程序名称&#xff1a; 在AndroidManifest.xml文件中修改应用程序名称&#xff1a; 打开Flutter项目中的android/app/src/main/AndroidManifest.xml文件。找到<application>标签&#xff0c;然后在android:label属性中修改应用程序的名称…

[幻灯片]软件需求设计方法学全程实例剖析-03-业务用例图和业务序列图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 pdf已上传至本号的CSDN资源&#xff0c;或到以下地址下载&#xff1a; http://umlchina.com/training/umlchina_03_bm.pdf

算法学习——LeetCode力扣补充篇2(724. 寻找数组的中心下标、34. 在排序数组中查找元素的第一个和最后一个位置、922. 按奇偶排序数组 II、35. 搜索插入位置、24. 两两交换链表)

算法学习——LeetCode力扣补充篇2 724. 寻找数组的中心下标 724. 寻找数组的中心下标 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右…

FPGA亚稳态学习总结

首先是组合逻辑电路考虑的是竞争冒险&#xff0c;冒险会产生毛刺。重点研究如何去毛刺 时序逻辑电路考虑的是时序不满足会产生的亚稳态问题&#xff1a;如何考量时序满不满足呢&#xff1f;根据不同的场景又有不同的说法。 时序分析的两组基本概念 建立时间与保持时间 1.在…

Docker 轻量级可视化工具 Portainer

1. 是什么 它是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便管理Docker环境&#xff0c;也包括单机环境和集群环境。 2. 安装 官网&#xff1a;Kubernetes and Docker Container Management Software 安装路径&#xff1a;Install the Compose plug…

本地搭建多人协作ONLYOFFICE文档服务器并结合Cpolar内网穿透实现公网访问远程办公

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…

spring注解@EventListener实现监听原理

文章目录 EventListener使用方式EventListener实现原理1.引入时机2 初始化时机3 作用时机->将加了EventListener注解的方法识别出来&#xff0c;并封装为监听器&#xff0c;加载spring容器中 总结 EventListener使用方式 package com.cyl.listener;import org.springframew…