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

news2024/9/28 21:19:05

目录

格式

头文件

宏定义

线性表的单链表存储结构

按位查找

插入元素

删除元素

头插法建立单链表

合并非递减单链表

其他基本操作

完整版

测试代码(主函数)

测试结果


格式

参考 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,否则返回ERROR
	LinkList 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个位置之前插入元素e
	LinkList 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或者大于表长+1
	LinkList 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,否则返回ERROR
	LinkList 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个位置之前插入元素e
	LinkList 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或者大于表长+1
	LinkList 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.11
	printf("请输入元素个数:");//构建单链表La
	scanf_s("%d", &n1);
	printf("请输入元素:");
	CreateList_L(La, n1);
	printf("\n");
	printf("头插法得到的元素逆序:");
	PrintList_L(La);

	//测试算法2.8
	i = GetElem_L(La, 3, e);
	if (i)
		printf("第3个元素为%d\n", e);
	else
		printf("第3个元素不存在\n");
	//测试算法2.9,2.10.
	i = ListInsert_L(La, 3, 3);
	if (i)
		printf("插入成功\n");
	else
		printf("插入失败\n");
	i = ListDelete_L(La, 5, e);
	if (i)
		printf("删除成功\n");
	else
		printf("删除失败\n");

	//测试算法2.12
	printf("请输入元素个数:");//构建单链表Lb
	scanf_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.coloradmin.cn/o/1407770.html

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

相关文章

安卓移动设备使用DS file文件管理工具远程访问本地群晖NAS文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接6. 结语 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用…

小模型也能COT

前两章我们分别介绍了COT的多种使用方法以及COT的影响因素。这一章更多面向应用&#xff0c;既现实场景中考虑成本和推理延时&#xff0c;大家还是希望能用6B的模型就不用100B的大模型。但是在思维链基础和进阶玩法中反复提到不论是few-shot还是zero-shot的思维链能力似乎都是1…

‘cnpm‘ 不是内部或外部命令,也不是可运行的程序

一、问题 昨天用npm 安装环境&#xff0c;实在太慢了&#xff0c;就想用cnpm&#xff0c;然后发现提示‘cnpm 不是内部或外部命令,也不是可运行的程序。 看了很多方法&#xff0c;选择了下面这个&#xff0c;运气好到爆棚&#xff0c;就直接可以用了。其他的方法暂未去了解。先…

【极数系列】Flink 初相识(01)

# 【极数系列】Flink 初相识&#xff08;01&#xff09; 引言 Flink官网&#xff1a;https://flink.apache.org/ Flink版本&#xff1a;https://flink.apache.org/blog/ Flink文档&#xff1a;https://ci.apache.org/projects/flink/flink-docs-release-1.12/ Flink代码库…

shell脚本-条件测试、

一.条件测试 1.&#xff08; &#xff09; 和 { } &#xff08;&#xff09;会进/data ,开启子shell { } 直接切过去了&#xff0c;不开子shell 小案例&#xff1a; 2. test 命令 测试特定的表达式是否成立&#xff0c;当条件成立&#xff0c;测试语句的返回值为0&#xff…

[BUG] Authentication Error

前言 给服务器安装了一个todesk&#xff0c;但是远程一直就是&#xff0c;点击用户&#xff0c;进入输入密码界面&#xff0c;还没等输入就自动返回了 解决 服务器是无桌面版本&#xff0c;或者桌面程序死掉了&#xff0c;重新安装就好 sudo apt install xorg sudo apt inst…

PIL笔记:通道+模式+坐标系统+基本图像操作

PIL Python Imaging Library&#xff0c;Python的图像处理核心库 通道bands 灰度图片是单通道组成 彩色图片是三通道RGB组成 真彩色图片是四通道RGBA组成 模式 RGB RGBA … 坐标系统 左上角为原点(0, 0) 图像操作 显示图像 show 创建图像 open()打开图像new()创建I…

嵌入式学习-C++-Day1

嵌入式学习-CDay1 一、思维导图 二、作业 1.提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数&#xff08;要求使用C风格字符串完成&#xff09; #include <iostream> #include <string.h>using namespace…

shopee母婴选品:Shopee平台上进行母婴类目的选品

在Shopee平台上进行母婴类目的选品时&#xff0c;卖家可以通过一些策略来提高产品的市场竞争力和销售业绩。下面将详细介绍这些策略。 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff08;复制浏览器打开&#xff09;&#xff1a;D。dDqbt。Com/JU5o知虾是Sh…

考研C语言刷题基础篇之分支循环结构基础(二)

目录 第一题分数求和 第二题&#xff1a;求10 个整数中最大值 第三题&#xff1a;在屏幕上输出9*9乘法口诀表 第四题&#xff1a;写一个代码&#xff1a;打印100~200之间的素数 第五题&#xff1a;求斐波那契数的第N个数 斐波那契数的概念&#xff1a;前两个数相加等于第三…

3.Eureka注册中心

3.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0…

git clone报错 fatal: unable to fork

1. 问题 git clone gitgithub.com:url-kaist/Quatro.git Cloning into Quatro... fatal: unable to fork 在使用Docker clone 代码时报错 2. 解决方法 查看是否安装openssh&#xff0c; 用以下命令查看系统是否已安装OpenSSH&#xff0c;如果有openssh-client和openssh-serve…

Oracle、MySQL数据库常规命令语法-简易记录(非常规持续更新)

前言:呈现的是非常基础必备命令以及常规关联语法,因涉及到不同数据库其表达都会有所区别,此篇纯属做个仓库记录更非常规持续更新,专业人士可忽略,且看且珍惜… MySQL: 关系型数据库、重点开源、支持大型规模、标准SQL数据语言、多平台多架构、高可用集群、可定制开发等…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而 PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是 PHP 能自己存储数据(临时存储) php变量的命名规则 必须以do…

邯郸银行2023年营收、利润双降:四季度亏损超1亿元,承压明显

近日&#xff0c;邯郸银行发布《2024年度同业存单发行计划》&#xff0c;披露了2023年部分财务数据。信息显示&#xff0c;邯郸银行2023年实现营业收入34.03亿元&#xff0c;同比下降0.98%&#xff1b;净利润6.21亿元&#xff0c;同比下降58.51%。 而结合此前的财务数据测算可知…

grid布局,flex布局实现类似响应式布局的效果

一. grid布局 实现代码 <!DOCTYPE html> <html lang"en"><head><style>.box {display: grid;grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); /*自动填充&#xff0c;最小宽度300px*/justify-content: space-between;gap:…

CC工具箱使用指南:【平差工具】

一、简介 平差是一个摘自英文单词“adiustment”的中文翻译&#xff0c;它最初源于土地测量工程&#xff0c;并在后来广泛应用于各个测量领域在传统的测量中&#xff0c;由于各种误差的存在&#xff0c;例如仪器、人为、大地形态等因素&#xff0c;所得到的测量结果是不完全准…

Android开发之部署opencv4

1 新建一个空项目 不再多说 2从官网下载opencv https://opencv.org/releases/ 下载opencv-4.9.0-android-sdk 3 导入模块 点击file->new->Import Module选择解压之后的opencv-android-sdk文件夹中的SDk文件夹&#xff0c;并将:sdk修改为:opencv&#xff08;我的已安…

MySQL 初识MySQL

目录 1 数据库1.1 前言1.2 数据库分类1.2.1 关系型数据库&#xff08;RDBMS&#xff09;1.2.2 非关系型数据库1.2.3 关系型数据库与非关系型数据库的区别 2 链接数据库3 SQL分类4 存储引擎 1 数据库 1.1 前言 到底什么是MySQL? 大家都知道MySQL叫做数据库。那么什么是数据库…

设置 SSH 主机 xxx: (details) 连接到 VS Code Server - 重试 6

问题背景 在vscode上ssh连接到某台服务器的时候一直显示重试&#xff0c;但在本地终端里却可以正常ssh。 解决方案 按 Ctrl Shift P 打开命令面板。输入 Remote-SSH: Kill VS Code Server on Host…。选择出现问题的服务器即可。 猜测是本地的vscode与远程服务器的 ~/.vsc…