数据结构 - 线性表(C语言版)

news2024/11/29 10:53:28

线性表分为顺序表单链表

线性表的操作主要是查询、插入、删除

1、顺序表

  • 首先,定义一个顺序表的结构体
#define MAX_SIZE 10
typedef struct {
	int data[MAX_SIZE];
	int length;
}SqList, * PsqList;
  • 创建一个线性表

在这里插入图片描述

void createSqList(PsqList pSqList) {
	pSqList->length = 0;
	for (int i = 0; i < MAX_SIZE - 5; i++) {
		pSqList->data[i] = (i + 1) * 3;
		pSqList->length++;
	}
}
  • 遍历线性表
void displaySqList(PsqList pSqList) {
	printf("\tSqList Length: %d\n", pSqList->length);
	for (int i = 0; i < pSqList->length; i++) {
		printf("\t%d", pSqList->data[i]);
	}
	printf("\n");
}

1.1、查询

  • 顺序查询
#include <string.h>

//根据数值查询位置
const char* queryPositionByValue(PsqList pSqList, int value) {
	const char* result = "表中无此数据";
	for (int i = 0; i < pSqList->length; i++) {
		if (pSqList->data[i] == value) {
			char buffer[100];
			sprintf_s(buffer, "数据 %d 在表中的位置 %d\n", value, i);
			result = _strdup(buffer);
			return result;
		}
	}
	return result;
}

1.2、插入

在这里插入图片描述

  • 在position处插入元素
  • 位置position在表中对应的序号 i = position-1
  • 思路:将v(length-1)至vi依次后移一位,然后将新数据插入vi
//在指定位置插入元素
void insertElementByPosition(PsqList pSqList, int position, int element) {
	if (position > MAX_SIZE || position < 1) {
		return;
	}

	if (pSqList->length >= MAX_SIZE) {
		return;
	}

	if (position == pSqList->length + 1) {
		pSqList->data[pSqList->length] = element;
		pSqList->length++;
		return;
	}

	int i = position - 1;
	for (int j = pSqList->length - 1; j >= i; j--) {
		pSqList->data[j + 1] = pSqList->data[j];
	}
	pSqList->data[i] = element;
	pSqList->length++;
}

1.3、删除

在这里插入图片描述

  • 删除position处的元素
  • 位置position在表中对应的序号 i = position-1
  • 思路:将v(i+1)至v(length-1)依次向前移动一位
//删除指定位置的元素
void deleteElementByPosition(PsqList pSqList, int position) {
	if (position < 1 || position > MAX_SIZE) {
		return;
	}

	if (position > pSqList->length) {
		return;
	}

	int i = position - 1;

	for (int j = i; j < pSqList->length - 1; j++) {
		pSqList->data[j] = pSqList->data[j + 1];
	}
	pSqList->length--;
}

1.4、运行结果

int main() {
	SqList sqList;
	PsqList pSqList = &sqList;
	createSqList(pSqList);
	displaySqList(pSqList);


	printf("\n\t查找数据 12\n");
	const char* result = queryPositionByValue(pSqList, 12);
	printf("\t%s", result);


	printf("\n\t在第3个位置插入数据 67\n");
	insertElementByPosition(pSqList, 3, 67);
	displaySqList(pSqList);

	printf("\n\t删除第4个位置的数据\n");
	deleteElementByPosition(pSqList, 4);
	displaySqList(pSqList);

	return 0;
}

在这里插入图片描述

2、单链表

  • 首先创建一个链表结构体
typedef struct LNode {
	int data;
	struct LNode* next;
}LNode, * LinkList;
  • 遍历链表
//遍历链表
void displayLinkList(LinkList p) {
	printf("\n");
	while (p != NULL) {
		printf("\t%d", p->data);
		p = p->next;
	}
	printf("\n");
}

2.1、创建单链表

(1)头插法

  • 创建链表
//头插法
void createLinkByHead(LinkList& linkList) {

	linkList = (LinkList)malloc(sizeof(LNode));
	linkList->data = 100;
	linkList->next = NULL;

	for (int i = 0; i < 5; i++) {
		LinkList p = (LinkList)malloc(sizeof(LNode));
		p->data = (i + 2) * 100;
		p->next = linkList->next;
		linkList->next = p;
	}
}

在这里插入图片描述

  • 输出结果
int main() {
	LinkList L1;
	createLinkByHead(L1);
	displayLinkList(L1);
	displayLinkList(L1);
	return 0;
}

在这里插入图片描述

(2)尾插法

  • 创建链表
//尾插法
void createLinkByTail(LinkList& linkList) {

	linkList = (LinkList)malloc(sizeof(LNode));
	linkList->data = 100;
	linkList->next = NULL;
	LinkList pre = linkList;
	for (int i = 0; i < 5; i++) {
		LinkList p = (LinkList)malloc(sizeof(LNode));
		p->data = (i + 2) * 100;
		pre->next = p;
		p->next = NULL;
		pre = p;
	}
}

在这里插入图片描述

  • 输出结果
int main() {
	LinkList L2;
	createLinkByTail(L2);
	displayLinkList(L2);
	displayLinkList(L2);
	return 0;
}

在这里插入图片描述

2.2、通过序号查找

//通过序号查找
LinkList queryByIndex(LinkList linkList, int index) {
	LinkList p = linkList;
	int i = 0;
	while (i < index) {
		p = p->next;
		i++;
	}
	return p;
}
  • 输出结果
int main() {
	LinkList L;
	createLinkByTail(L);
	displayLinkList(L);

	int position = 3;
	LinkList p= queryByIndex(L, position-1);
	printf("\n\t第 %d 个元素的值是 %d\n", position, p->data);
	return 0;
}

在这里插入图片描述

2.3、通过序号插入

//通过序号插入
LinkList insertByIndex(LinkList linkList, int index, int data) {

	LinkList pEle = (LinkList)malloc(sizeof(LNode));
	pEle->data = data;
	pEle->next = NULL;

	LinkList pre = linkList;
	LinkList p = pre;
	if (index == 0){
		pEle->next = pre;
		linkList = pEle;
	}
	else {
		for (int i = 0; i < index; i++) {
			pre = p;
			p = p->next;
		}
		pre->next = pEle;
		pEle->next = p;
	}
	return linkList;
}
  • 输出结果
int main() {
	LinkList L;
	createLinkByTail(L);
	displayLinkList(L);


	int positionInsert1 = 3;
	printf("\n\t在第 %d 个位置插入\n", positionInsert1);
	LinkList LInsert1 = insertByIndex(L, positionInsert1 - 1, 333);
	displayLinkList(LInsert1);

	int positionInsert2 = 1;
	printf("\n\t在第 %d 个位置插入\n", positionInsert2);
	LinkList LInsert2 = insertByIndex(LInsert1, positionInsert2 - 1, 111);
	displayLinkList(LInsert2);


	int positionInsert3 = 8;
	printf("\n\t在第 %d 个位置插入\n", positionInsert3);
	LinkList LInsert3 = insertByIndex(LInsert2, positionInsert3 - 1, 888);
	displayLinkList(LInsert3);


	int positionInsert4 = 10;
	printf("\n\t在第 %d 个位置插入\n", positionInsert4);
	LinkList LInsert4 = insertByIndex(LInsert3, positionInsert4 - 1, 101010);
	displayLinkList(LInsert4);

	return 0;
}

在这里插入图片描述

2.4、通过序号删除

//通过序号删除
LinkList deleteByIndex(LinkList linkList, int index) {

	LinkList pre = linkList;

	if (index == 0) {
		linkList = linkList->next;
		pre->next = NULL;
		free(pre);
	}
	else {
		LinkList p = pre;
		for (int i = 0; i < index; i++) {
			pre = p;
			p = p->next;
		}
		pre->next = p->next;
		p->next = NULL;
		free(p);

	}
	return linkList;
}
  • 输出结果
int main() {
	LinkList L;
	createLinkByTail(L);
	displayLinkList(L);


	int positionDel1 = 3;
	printf("\n\t删除第 %d 个元素的值\n", positionDel1);
	LinkList LDel1= deleteByIndex(L, positionDel1 - 1);
	displayLinkList(LDel1);

	int positionDel2 = 1;
	printf("\n\t删除第 %d 个元素的值\n", positionDel2);
	LinkList LDel2 = deleteByIndex(LDel1, positionDel2 - 1);
	displayLinkList(LDel2);

	int positionDel3 = 4;
	printf("\n\t删除第 %d 个元素的值\n", positionDel3);
	LinkList LDel3 = deleteByIndex(LDel2, positionDel3 - 1);
	displayLinkList(LDel3);


	return 0;
}

在这里插入图片描述

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

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

相关文章

Spring—事务及事务的传播机制

Spring—事务及事务的传播机制 &#x1f50e;事务的定义&#x1f50e;Spring—事务的实现铺垫Spring 编程式事务Spring 声明式事务Transactional 的参数注意事项Transactional 的工作原理 &#x1f50e;Spring—事务的隔离级别MySQL—事务的隔离级别Spring—事务的隔离级别Spri…

剑指 Offer 04. 二维数组中的查找(java)

二维数组中的查找 剑指 Offer 04. 二维数组中的查找题目描述抽象 BST 解题 二叉树专题 剑指 Offer 04. 二维数组中的查找 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof 题目描述…

js为啥是设计成单线程而不是多线程呢

了解这个问题之前&#xff0c;需要先了解一下以下问题&#xff1a; 什么是进程&#xff1f;什么是线程&#xff1f;二者有啥关联&#xff1f;任务队列是什么&#xff1f;宏任务&#xff1f;微任务&#xff1f;eventloop&#xff1f;为什么说js是单线程&#xff0c;为什么要设计…

UWB高精度定位标签方案,厘米级室内测距,实时人员物品位置确定

随着科技的不断进步&#xff0c;UWB技术正逐渐成为各个领域的定位解决方案的首选。其高精度、安全、实时的特性使其在安全免提访问控制、实时室内定位等应用领域发挥着重要的作用。 安全免提访问控制是目前应用UWB技术的重要领域之一。通过将UWB标签&#xff08;如手机、钥匙扣…

Django如何删除数据库表中的数据【不断积累】

这篇博客积累Django的数据库常用删除方法。 假设有表模型Author定义如下&#xff1a; class Author(models.Model):name models.CharField(max_length100)def __str__(self):return self.name01-根据记录的id号来删除指定的记录 Django 默认为每个模型添加一个名为 id 的自…

RPA赋能日化产业,实在智能广东日化共推行业数字化转型

广东日化&#xff0c;因其独特的地域、产能优势&#xff0c;成为广东制造业的支柱产业之一&#xff0c;占据了全国日化行业的半壁江山。作为本土最具影响力商会组织之一&#xff0c;广东省日化商会凝聚了一批具有影响力的日化企业&#xff0c;其经济总量、市场占有率、品牌知名…

python网站创建:初识网站(001)

1. 初识网站&#xff1a;首先来认识一下&#xff0c;前端、后端、数据库它是怎么分工合作来形成网站的 使用python创建网站之前&#xff0c;需要先稍微认识一下两个最流行python web框架&#xff1a;(Flask)和(Django) Flask是一个轻量级的框架&#xff0c;适用于比较轻巧&…

【*1900倍数遍历】CF1627 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 在枚举数列子集的gcd时&#xff0c;通常可以枚举倍数 对于这道题要注意&#xff0c;j/i的gcd要为1&#xff0c;这样才能保证i是这个子集的最大公约数 Code&#xff1a; #include <bits/stdc.h>//#define…

三菱FX3U简单工程编程

1.简单工程编程 1.1.元件 常开触点&#xff08;ld&#xff09; 选中位置&#xff0c;点击图标&#xff0c;输入软元件&#xff0c;完成添加。 选中位置&#xff0c;快捷键F5添加。 选中位置&#xff0c;输入ld 软元件添加。常闭触点&#xff08;ldi&#xff09;横线、竖线 …

红黑树增删操作详解(相信我,这次你一定会弄懂)

前言&#xff1a; 网上众多关于红黑树的讲解&#xff0c;但大多数都是重复的&#xff0c;只列出了几种简单情况&#xff0c;逻辑和思维深度都不足以解答吾之困惑。。。 直到看到张彦峰先生的 对红黑树的认识总结&#xff0c;基本可以说是集大成者&#xff0c;本文会基于…

MySQL原理探索——28 读写分离有哪些坑

在上一篇文章中&#xff0c;介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景&#xff1a;读写分离&#xff0c;以及怎么处理主备延迟导致的读写分离问题。 我们在上一篇文章中提到的一主多从的结构&#xff0c;其实就是读写分离的基本结构了。这里…

linux环境下使用jmeter进行分布式测试

目录 1、前言 2、环境准备 3、分布式配置 总结&#xff1a; 1、前言 熟练使用jmeter进行性能测试的工程师都知道&#xff0c;jmeter的客户端性能是有点差的。这会导致一个问题&#xff0c;其客户端的性能损耗会干扰到性能测试的结果&#xff0c;而且当线程数/并发大到一定程…

我爱学QT-仿写智能家居界面 上 中 下

学习链接&#xff1a; 仿写一个智能家居界面&#xff08;上&#xff09;_哔哩哔哩_bilibili 上 给QT工程添加资源文件 在这里 然后选这个&#xff0c;choose后会有起名&#xff0c;之一千万不能是中文&#xff0c;要不就等报错吧 然后把你要添加的图片托到文件夹下&#xf…

FPGA好找工作吗?薪资待遇怎么样?

FPGA&#xff1a;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的&#xff0c;既解决了定制电路的不足&#xff0c;又克服了原有可编程器件门电路数有限的缺点。 FPGA太…

Codeforces round 883 div3

A. Rudolph and Cut the RopeA. Rudolph and Cut the Rope 题目大意 有 n 个钉子钉在墙上&#xff0c;第 i 个钉子被钉在离地面 ai 米高的位置&#xff0c;一根长度为 bi 米的绳子的一端被绑在它上面。所有钉子都悬挂在不同的高度上。糖果同时被绑在所有绳子的末端&#xff0…

浅谈关于智慧校园安全用电监测系统的设计

0引言 人生人身安全是大家关注的话题&#xff0c;2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起&#xff08;中国消防2019.12.应急管理部消防救援局官方微博&#xff09;&#xff0c;违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数…

【力扣算法05】之 _1911_ 最大子序列交替和- python

文章目录 问题描述示例 1示例2示例3提示 思路分析代码分析完整代码运行示例代码示例1示例2示例3 完结 问题描述 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说&#xff0c;数组 [4,2,5,3] 的交替和为 (4 5) - (2 3) 4…

804. n的阶乘

链接&#xff1a; https://www.acwing.com/problem/content/806/ 题目&#xff1a; 输入一个整数 nn&#xff0c;请你编写一个函数&#xff0c;int fact(int n)&#xff0c;计算并输出 nn 的阶乘。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 共一行&#xff0c;包…

OpenCV(图像处理)-图片搜索

图片搜索 1.知识介绍2.实现流程2.1 计算特征点与描述子2.2 描述子的匹配2.3 求出单应性矩阵并画出轮廓2.4 将特征点标出 此篇博客作者仍在探索阶段&#xff0c;还有一些模糊的概念没有弄懂&#xff0c;请读者自行分辨。 1.知识介绍 Opencv进行图片搜索需要的知识有&#xff1…

多个input框或其他框的值相加之和并且处理精度问题

需求&#xff1a;实付金额不能手动输入&#xff0c;并且等于购买数量✖优惠价➖平台补贴➖店铺补贴 把需要处理的这几个框绑上change事件等于同一个方法名 change"handleChange" handleChange(value){let _this this;let isNull validatenull;_this.ruleForm.pre…