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

线性表分为顺序表单链表

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

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) {char bf[100];sprintf_s(bf, "表中没有数据 %d\n", value);const char* result = _strdup(bf);for (int i = 0; i < pSqList->length; i++) {if (pSqList->data[i] == value) {char buffer[100];sprintf_s(buffer, "数据 %d 在表中的位置 %d\n", value, i+1);result = _strdup(buffer);return result;}}return result;
}
  • 输出结果
int main() {PsqList pL = (PsqList)malloc(sizeof(SqList));createSqList(pL);displaySqList(pL);const char* res1 = queryPositionByValue(pL, 3);printf("\n\t%s\n", res1);const char* res2 = queryPositionByValue(pL, 9);printf("\t%s\n", res2);const char* res3 = queryPositionByValue(pL, 15);printf("\t%s\n", res3);const char* res4 = queryPositionByValue(pL, 20);printf("\t%s\n", res4);return 0;
}

在这里插入图片描述

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++;
}
  • 输出结果
int main() {PsqList pL = (PsqList)malloc(sizeof(SqList));createSqList(pL);printf("\n");displaySqList(pL);int position1 = 1;int v1 = 111;insertElementByPosition(pL, position1, v1);printf("\n\t在第 %d 个位置插入 %d\n", position1, v1);displaySqList(pL);int position2 = 3;int v2 = 333;insertElementByPosition(pL, position2, v2);printf("\n\t在第 %d 个位置插入 %d\n", position2, v2);displaySqList(pL);int position3 = 7;int v3 = 777;insertElementByPosition(pL, position3, v3);printf("\n\t在第 %d 个位置插入 %d\n", position3, v3);displaySqList(pL);int position4 = 9;int v4 = 999;insertElementByPosition(pL, position4, v4);printf("\n\t在第 %d 个位置插入 %d\n", position4, v4);displaySqList(pL);return 0;
}

在这里插入图片描述

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--;
}
  • 运行结果
int main() {PsqList pL = (PsqList)malloc(sizeof(SqList));createSqList(pL);printf("\n");displaySqList(pL);int position1 = 1;deleteElementByPosition(pL,position1);printf("\n\t删除第 %d 个位置元素\n", position1);displaySqList(pL);int position2 = 2;deleteElementByPosition(pL, position2);printf("\n\t删除第 %d 个位置元素\n", position2);displaySqList(pL);int position3 = 3;deleteElementByPosition(pL, position3);printf("\n\t删除第 %d 个位置元素\n", position3);displaySqList(pL);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.hqwc.cn/news/18597.html

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

相关文章

【Excel】csv乱码

原因 CSV用UTF-8编码 Excel用ANSI编码 解决 1 创建一个新的Excel 2 数据 > 从文本/CSV 3 选择文件 4 选择 文件原始格式 和 分隔符 &#xff08;根据自己文件进行选择&#xff0c;如果不知道编码&#xff0c;可以一个一个的试&#xff0c;直到不出现乱码&#xff09;

CCLINK转MODBUS-TCP网关cclink利modbus区别

大家好&#xff0c;今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议&#xff0c;它们的不同使得数据互通比较困难&#xff0c;但远创智控YC-CCLK-TCP网关的出现改变了这一切。 1&#xff0c; 远创智控YC-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关&#xff…

Blender初学者入门:做一个魔方

文章目录 安装和使用基本操作物体属性材质 安装和使用 由于Blender是开源免费的&#xff0c;所以可直接在官网下载&#xff0c;正常安装&#xff0c;没有坑点。 在打开Blender后&#xff0c;创建新文件&#xff0c;选择General&#xff0c;就会得到一个立方体&#xff0c;而界…

hadoop -Unable to start failover controller. Parent znode does not exist

Unable to start failover controller. Parent znode does not exist 问题描述 今天使用星环的TDH集群时&#xff0c;HDFS服务宕掉&#xff0c;在后台查看namenode 始终起不来 kubectl get pod -o wide | grep hdfs 如上图&#xff0c;k8s pod 起来又crash 掉&#xff0c;然后…

手机外壳缺陷视觉检测软硬件方案

单独使用一种光源效果图 同轴光会出现亮度不够的情况&#xff1b;回形面光因为光源中间的圆孔会使图像有阴影&#xff0c;造成图像效果不均衡&#xff0c;所以不采用单独光源打光 使用同轴回形面光源效果图 回形光源照亮产品要寻找的边缘&#xff0c;同轴光源起到补光的作用&a…

【学会动态规划】第 N 个泰波那契数(1)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 4. 空间优化 写在最后 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟…

vue2 若依项目,使用plotly.js-dist图表库,将数据图表一键导出为图片

此代码适用的场景是一个页面有多个数据图表。 首先需要拿到你生成数据图表的数据&#xff0c; 然后赋值给一个数组&#xff0c;数组需要在data定义&#xff0c;还需要去重。 // 检查是否有相同的parameter值const hasDuplicate this.toImageArr.some(iiem > iiem.paramete…

C++万字自学笔记

[TOC] 一、 C基础 C的IDE有CLion、Visual Studio、DEV C、eclipse等等&#xff0c;这里使用CLion进行学习。 0. C初识 0.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 #include <iostream>int main() {using namespace std;cout…

【SpringBoot_Error】关于SpringBoot项目中经常出现yml/xml识别不到的问题

Problems 关于关于SpringBoot项目中经常出现yml/xml识别不到的问题 Solution 在pom.xml文件的<build></build>标签中添加如下代码&#xff1a; > <build><resources><!--检测mapperxml&#xff0c;本项目数据访问层的SQL xml文件放在Java包…

nginx配置例子-反向代理实现

4.1 反向代理实现&#xff08;实例1&#xff09; 4.1.1需要实现的效果 (1)打开浏览器&#xff0c;在浏览器地址栏输入地址 www.123.com&#xff0c;跳转到liunx.系统tomat主页面中 4.1.2 准备工作 (1&#xff09;在liunx, 系统安装 tomcat, 使用默认端口8080. tomcat安装文…

学习python爬虫需要掌握哪些库?

目录 常见的几种爬虫库 1. Requests 2. BeautifulSoup 3. Selenium 4. Scrapy 5. Urllib 6. Scrapy-Redis 7. Pillow 示例代码 1. Requests 2. BeautifulSoup 3. Selenium 4. Scrapy 5. Urllib 6. Scrapy-Redis 7. Pillow 总结 常见的几种爬虫库 在学习Python爬…

Abandoning the Bayer-Filter to See in the Dark 论文阅读笔记

这是CVPR2022的一篇暗图增强的文章&#xff0c;TCL AI Lab与福州大学&#xff0c;韩国延世大学&#xff0c;安徽大学的合作论文网络以黑暗环境下拍摄的color raw为输入&#xff0c;用一个de-bayer-filter module恢复无拜尔滤波器的raw data&#xff08;文章认为拜尔滤波器使得光…