数据结构(C语言版)代码实现(三)——单链表部分代码实现

目录

格式

头文件

宏定义

线性表的单链表存储结构

按位查找

插入元素

删除元素

头插法建立单链表

合并非递减单链表

其他基本操作

完整版

测试代码(主函数)

测试结果


格式

参考 2.3节 线性表的链式表示和实现

头文件

宏定义

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef int ElemType;

线性表的单链表存储结构

//-----线性表的单链表存储结构-----
typedef struct LNode {ElemType data;struct LNode* next;
}LNode,*LinkList;

按位查找

//算法2.8 函数GetElem在单链表中的实现。
Status GetElem_L(LinkList L, int i, ElemType& e) {//L为带头结点的单链表的头指针。//当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORLinkList p = L->next;int j = 1;//初始化,p指向第一个结点,j为计数器while (p && j < i) {//顺指针向后查找,直到p指向第i个元素或p为空p = p->next;++j;}if (!p || j > i)return ERROR;//第i个元素不存在e = p->data;//取第i个元素return OK;
}

插入元素

//算法2.9 函数ListInsert在单链表中的实现
Status ListInsert_L(LinkList& L, int i, ElemType e) {//在带头结点的单链线性表L中第i个位置之前插入元素eLinkList p = L;int j = 0;while (p && j < i - 1) {p = p->next;++j;//寻找第i-1个结点}if (!p || j > i - 1)return ERROR;//i小于1或者大于表长+1LinkList s = (LinkList)malloc(sizeof(LNode));//生成新结点s->data = e;s->next = p->next;//插入L中p->next = s;
}

删除元素

//算法2.10 函数ListDelete在单链表中的实现
Status ListDelete_L(LinkList& L, int i, ElemType& e) {//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值LinkList p = L;int j = 0;while (p && j < i - 1) {p = p->next;++j;//寻找第i个结点,p->next所在的位置}if (!(p->next) || j > i - 1)return ERROR;//删除位置不合理LinkList q = p->next;p->next = q->next;//删除并释放结点e = q->data;free(q);return OK;
}

头插法建立单链表

//算法2.11 头插法建立单链表
void CreateList_L(LinkList& L, int n) {//逆位序输入n个元素的值,建立带表头结点的单链线性表L。L = (LinkList)malloc(sizeof(LNode));L->next = NULL;//先建立一个带头结点的单链表LinkList p;for (int i = n;i > 0;i--) {p = (LinkList)malloc(sizeof(LNode));scanf_s("%d", &p->data);//输入元素值p->next = L->next;//插入到表头L->next = p;//插入到表尾// LinkList T=L;// for循环,用下面三行替换插入表头两行//p->next=NULL;//T->next=p;//T=p;}
}

合并非递减单链表

//算法2.12 合并非递减单链表
void MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc) {//已知顺序线性表La和Lb的元素按值非递减排列//归并La和Lb得到的新的顺序线性表Lc,Lc的元素也按值非递减排列LinkList pa = La->next;LinkList pb = Lb->next;LinkList pc = Lc = La;//用La的头结点作为Lc的头结点while (pa && pb) {if (pa->data <= pb->data) {pc->next = pa;pc = pa;pa = pa->next;}else {pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb;//插入剩余段free(Lb);//释放Lb的头结点
}

free函数不能放在while循环内,否则会出现以下情况。

警告信息:使用未初始化的内存"Lb"。

看不懂,但这个问题解决了。

其他基本操作

void PrintList_L(LinkList L) {//打印链表LinkList p = L->next;while (p) {//while(p=p->next)这样写行吗?printf("%d ", p->data);p = p->next;}printf("\n");
}Status DestroyList_L(LinkList& L) {//销毁链表LinkList p;while (L) {p = L;L = L->next;free(p);//free函数的释放是只释放一个结点,还是释放后面相关的所有结点?--已解决,只释放一个结点。}return OK;
}

完整版

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef int ElemType;//-----线性表的单链表存储结构-----
typedef struct LNode {ElemType data;struct LNode* next;
}LNode,*LinkList;//算法2.11 头插法建立单链表
void CreateList_L(LinkList& L, int n) {//逆位序输入n个元素的值,建立带表头结点的单链线性表L。L = (LinkList)malloc(sizeof(LNode));L->next = NULL;//先建立一个带头结点的单链表LinkList p;for (int i = n;i > 0;i--) {p = (LinkList)malloc(sizeof(LNode));scanf_s("%d", &p->data);//输入元素值p->next = L->next;//插入到表头L->next = p;//插入到表尾// LinkList T=L;// for循环,用下面三行替换插入表头两行//p->next=NULL;//T->next=p;//T=p;}
}//算法2.8 函数GetElem在单链表中的实现。
Status GetElem_L(LinkList L, int i, ElemType& e) {//L为带头结点的单链表的头指针。//当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORLinkList p = L->next;int j = 1;//初始化,p指向第一个结点,j为计数器while (p && j < i) {//顺指针向后查找,直到p指向第i个元素或p为空p = p->next;++j;}if (!p || j > i)return ERROR;//第i个元素不存在e = p->data;//取第i个元素return OK;
}//算法2.9 函数ListInsert在单链表中的实现
Status ListInsert_L(LinkList& L, int i, ElemType e) {//在带头结点的单链线性表L中第i个位置之前插入元素eLinkList p = L;int j = 0;while (p && j < i - 1) {p = p->next;++j;//寻找第i-1个结点}if (!p || j > i - 1)return ERROR;//i小于1或者大于表长+1LinkList s = (LinkList)malloc(sizeof(LNode));//生成新结点s->data = e;s->next = p->next;//插入L中p->next = s;
}//算法2.10 函数ListDelete在单链表中的实现
Status ListDelete_L(LinkList& L, int i, ElemType& e) {//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值LinkList p = L;int j = 0;while (p && j < i - 1) {p = p->next;++j;//寻找第i个结点,p->next所在的位置}if (!(p->next) || j > i - 1)return ERROR;//删除位置不合理LinkList q = p->next;p->next = q->next;//删除并释放结点e = q->data;free(q);return OK;
}//算法2.12 合并非递减单链表
void MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc) {//已知顺序线性表La和Lb的元素按值非递减排列//归并La和Lb得到的新的顺序线性表Lc,Lc的元素也按值非递减排列LinkList pa = La->next;LinkList pb = Lb->next;LinkList pc = Lc = La;//用La的头结点作为Lc的头结点while (pa && pb) {if (pa->data <= pb->data) {pc->next = pa;pc = pa;pa = pa->next;}else {pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb;//插入剩余段free(Lb);//释放Lb的头结点
}void PrintList_L(LinkList L) {//打印链表LinkList p = L->next;while (p) {//while(p=p->next)这样写行吗?printf("%d ", p->data);p = p->next;}printf("\n");
}Status DestroyList_L(LinkList& L) {//销毁链表LinkList p;while (L) {p = L;L = L->next;free(p);//free函数的释放是只释放一个结点,还是释放后面相关的所有结点?--已解决,只释放一个结点。}return OK;
}

测试代码(主函数)

#include "LinkList.h"int main()
{LinkList La = NULL,Lb = NULL,Lc = NULL;int n1,n2;Status i = 0;ElemType e;//变量声明//测试算法2.11printf("请输入元素个数:");//构建单链表Lascanf_s("%d", &n1);printf("请输入元素:");CreateList_L(La, n1);printf("\n");printf("头插法得到的元素逆序:");PrintList_L(La);//测试算法2.8i = GetElem_L(La, 3, e);if (i)printf("第3个元素为%d\n", e);elseprintf("第3个元素不存在\n");//测试算法2.9,2.10.i = ListInsert_L(La, 3, 3);if (i)printf("插入成功\n");elseprintf("插入失败\n");i = ListDelete_L(La, 5, e);if (i)printf("删除成功\n");elseprintf("删除失败\n");//测试算法2.12printf("请输入元素个数:");//构建单链表Lbscanf_s("%d", &n2);printf("请输入元素:");CreateList_L(Lb, n2);printf("\n");printf("头插法得到的元素逆序:");PrintList_L(Lb);MergeList_L(La, Lb, Lc);printf("新链表的元素:");PrintList_L(Lc);DestroyList_L(Lc);//因为Lc实质是La和Lb的合并,而且Lb的头结点已经被释放了。return 0;
}

测试结果

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

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

相关文章

【C++】命名空间详解

目录 前言 命名空间的定义 命名空间的使用 前言 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以…

【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)

目录 1、题目介绍 2、解题思路 2.1、优先队列解法 2.2、top-k问题解法 1、题目介绍 原题链接&#xff1a;面试题 17.14. 最小K个数 - 力扣&#xff08;LeetCode&#xff09; 题目要求非常简短&#xff0c;也非常简单&#xff0c;就是求一组数中的k个最小数。 2、解题思路 …

数据结构:完全二叉树(递归实现)

如果完全二叉树的深度为h&#xff0c;那么除了第h层外&#xff0c;其他层的节点个数都是满的&#xff0c;第h层的节点都靠左排列。 完全二叉树的编号方法是从上到下&#xff0c;从左到右&#xff0c;根节点为1号节点&#xff0c;设完全二叉树的节点数为sum&#xff0c;某节点编…

uniapp使用uni-forms表单校验无效

查看是否写了name属性&#xff0c;且name属性的属性值得和下面v-model绑定的一致&#xff0c;否则校验不生效 官网

一种解决常用存储设备无法被电脑识别的方法

一、通用串行总线控制器描述 通用串行总线&#xff08;Universal Serial Bus&#xff0c;简称USB&#xff09;&#xff0c;是连接电脑与设备的一种序列总线标准&#xff0c;也是一种输入输出&#xff08;I/O&#xff09;连接端口的技术规范&#xff0c;广泛应用于个人电脑和移动…

关于大模型学习中遇到的4

来源&#xff1a;网络 相关学习可查看文章&#xff1a;Transformer and Pretrain Language Models3-4​​​​​​​ 什么是MLP? MLP是多层感知器&#xff08;Multilayer Perceptron&#xff09;的缩写&#xff0c; 多层感知机&#xff08;MLP&#xff09;是一种人工神经网…

【C++】初步认识基于C的优化

C祖师爷在使用C语言时感觉到了不方便的一些点&#xff0c;于是一步一步改进优化&#xff0c;最后形成了C 本文将盘点一下基于C的语法优化 目录 命名空间&#xff1a;命名空间定义&#xff1a;命名空间使用&#xff1a; C输入&输出&#xff1a;cout&#xff1a;endl&#…

C语言每日一题(47)两数相加II

力扣 445 两数相加II 题目描述 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 示例1&#xff1a; 输入&#xff…

(2024,强化学习,扩散,奖励函数)扩散模型的大规模强化学习

Large-scale Reinforcement Learning for Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1. 使用多步骤 MDP 的策略梯度 3.2. 基于分布的奖励函…

2023 中国互联网公司 Top 100 排行榜

中国互联网协会发布了《中国互联网企业综合实力指数&#xff08;2023&#xff09;》报告&#xff0c;来源&#xff1a;https://www.isc.org.cn/article/18458024914186240.html 预览如下&#xff1a; 这份报告总结了互联网公司的排名&#xff0c;毫不意外&#xff0c;腾讯、阿里…

设计模式⑧ :管理状态

文章目录 一、前言二、Observer 模式1. 介绍2. 应用3. 总结 三、Memento 模式1. 介绍2. 应用3. 总结 四、State 模式1. 介绍2. 应用3. 总结 参考文章 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决…

大势浏览器DasViewer的底图能否改为卫星底图?

支持的。官网3.2.4版本tif格式的影像图可以加进来。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 #DasViewer##实景三维##三…

写了7年代码,第一次见这么狗血的小Bug!

大家好&#xff0c;我是程序员鱼皮。 孽起 Bug 年年有&#xff0c;今年特别多。前段时间给大家分享过一个 特别坑的小 Bug&#xff0c;结果这两天我个倒霉蛋又遇到一个特别离谱的 Bug&#xff0c;有多离谱&#xff1f;大家可以看看视频&#xff1a;https://www.bilibili.com/vi…

23111 C++ day1

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include<array>using namespace std;int main() {int a0,A0,num0,space0,other0;array<char…

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能&#xff1a; 只有正确率大于等于 80% 才可以进行抽奖&#xff1b;“谢谢参与”概率为 90%&#xff0c;“恭喜中奖”概率为 10%&#xff1b; 需求实现 实…

综合CRM客户管理系统

技术框架&#xff1a; JAVA MYSQL SSH 功能介绍&#xff1a; 个人工作、信息中心、客户管理、合同订单、财务管理、产品管理、人事管理以及数据回收站等8个模块。另包括权限管理模块用于系统的用户、角色和相关权限&#xff0c;收发邮件功能用于获得客户的详细需求&#xf…

docker 基础手册

文章目录 docker 基础手册docker 容器技术镜像与容器容器与虚拟机docker 引擎docker 架构docker 底层技术docker 二进制安装docker 镜像加速docker 相关链接docker 生态 docker 基础手册 docker 容器技术 开源的容器项目&#xff0c;使用 Go 语言开发原意“码头工人”&#x…

Java基础进阶02-xml

一、XML&#xff08;可拓展标记语言&#xff09; 1.学习网站&#xff1a; https://www.w3schoo1.com.cn 标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展:标签的名字是可以自定义的 2.作用 用于进行存储数据和传输数据 作为软件的配置文件 …

MySQL 8.3 发布, 它带来哪些新变化?

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能&#xff0c;更多是修复bug )&#xff0c;本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

使用IntelliJ IDEA快速搭建springboot 基础模板项目

使用IntelliJ IDEA快速搭建springboot 基础模板项目&#xff01;今天和大家分享一下&#xff0c;如何使用IntelliJ IDEA里面的maven插件&#xff0c;来快速搭建一个简单的Springboot基础项目。 第一步&#xff0c;菜单里面找到&#xff0c;文件-》新建-项目。如图。我们勾选了是…