当前位置: 首页 > news >正文

【考研】数据结构(更新到顺序表)

声明:所有代码都可以运行,可以直接粘贴运行(只有库函数没有声明)

线性表的定义和基本操作

基本操作

  1. 定义
    静态:
#include<stdio.h>
#include<stdlib.h>#define MaxSize 10//静态 
typedef struct{int data[MaxSize];int length;
}SqList;void InitList(SqList &L)//初始化 
{for(int i=0;i<MaxSize;i++){L.data[i]=0;}L.length=0;
}int main(void)
{SqList L;InitList(L);for(int i=0;i<L.length;i++){printf("the data %d is %d",i,L.data[i]);}return 0;
}

动态:

#include<stdio.h>
#include<stdlib.h>#define InitSize 10typedef struct{int *data;int MaxSize;//最大容量 int length;//当前长度 
}SeqList;void Init(SeqList &L)
{L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}int main(void){return 0;
}
  1. 插入
    静态:
//插入操作,bool用于判断操作是否成功 (处理异常情况) 
bool ListInsert(SqList &L,int i,int e){if(i<1 || i>L.length+1) return false;//条件判断 if(L.length >= MaxSize) return false;for(int j=L.length;j>=i;i--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;
}

在这里插入图片描述
动态:


  1. 删除
    静态:
bool ListDelete(SqList &L,int i,int &e){if(i<1||i>L.length) return false;e=L.data[i-1];for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}

动态顺序表以及各个操作

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10typedef struct{int *data;int MaxSize;int length;
}SqList;void debug(SqList L){printf("当前顺序表的数据为length=%d maxsize=%d\n",L.length,L.MaxSize);
}
//初始化
void InitList(SqList &L){L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}//增加动态数组的长度
void IncreaseSize(SqList &L,int len){int *p=L.data;L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i<L.length;i++){L.data[i]=p[i];//将数据复制到新区域 }L.MaxSize=L.MaxSize+len;//顺序表最大长度增加len free(p);//释放空间		
} //插入操作
bool ListInsert(SqList &L,int i,int e){//范围判断 if(i<1 || i>L.length+1)return false;if(L.length>L.MaxSize)return false;for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return true;
} 删除操作,删除第i个数据并且返回被删除的数据 
bool ListDelete(SqList &L,int i,int &e)
{//范围判断if(i<1 || i>L.length+1) return false;else{//保存删除元素e=L.data[i]; for(int j=i;j<L.length;j++){L.data[j]=L.data[j+1];}L.length--;} return true;} //按位查找
int getElemBybit(SqList L,int i){//Check if the line has been crossedif(i<1 || i>L.length){printf("Cross the border!");return 0;}return L.data[i-1];
} //按值查找
int getElemByValue(SqList L,int value){for(int i=0;i<L.length;i++){if(L.data[i] == value){return i-1;}}printf("Can`t find the elem!");return 0;
} //打印操作
void print(SqList L){for(int i=0;i<L.length;i++){printf("%d ",L.data[i]);}printf("\n");
} //测试函数 
int main(void){SqList L;debug(L);InitList(L);debug(L);for(int i=0;i<L.MaxSize;i++){L.data[i]=i;L.length++;}IncreaseSize(L,5);debug(L);print(L);if(ListInsert(L,2,5)){printf("插入成功,插入后数值");print(L);}else printf("插入失败");int e=0;if(ListDelete(L,3,e)){print(L);printf("被删除元素为:%d",e);}int value,position;printf("\nPlease input the value and the position:");  scanf("%d %d", &value, &position);  printf("\nget the emlem by value :the elem position is%d\n",getElemByValue(L,value));printf("\nget the emlem by positon:the value is%d\n",getElemBybit(L,position));return 0;
}

单链表基本操作

操作:

// 初始化一个链表,带头结点
bool InitList(LinkList* L);// 按照位序插入
bool ListInsert(LinkList* L, int i, int e);// 指定结点的后插操作
bool InsertNextNode(LNode* p, int e);// 指定结点的前插操作
bool InsertPriorNode(LNode* p, int e);// 按位序删除结点
bool ListDelete(LinkList* L, int i, int* e);// 创建方式 - 头插法创建
LinkList List_HeadInsert(LinkList* L);//创建方法 - 尾插法创建
LinkList List_TailInsert(LinkList* L);//指定结点的删除
bool DeleteNode(LNode *p);//按位查找
LNode *GetElem(LinkList L,int i);//按值查找
LNode *LocateElem(LinkeList L,int e); //求单链表的长度
int length(LinkList L);//链表逆置
LNode *Inverse(LNode *L); // 打印链表
void print(LinkList L); 

操作实现:

// 打印链表
void print(LinkList L) {LinkList E = L->next;while (E != NULL) {printf("%d ", E->data);E = E->next;}printf("\n");
}// 初始化一个链表,带头结点
bool InitList(LinkList* L) {*L = (LNode*)malloc(sizeof(LNode));if (*L == NULL) return false;(*L)->next = NULL;printf("Initialization of the linked list succeeded!\n");return true;
}// 按照位序插入
bool ListInsert(LinkList* L, int i, int e) {if (i < 1) return false; // 判断操作合法LNode* p = *L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;}int choice =0;printf("Prior or next?(1/2)");scanf("%d",&choice);if(choice == 2)return InsertNextNode(p, e);if(choice == 1)return InsertPriorNode(p,e);elsereturn false;
}// 指定结点的后插操作 
bool InsertNextNode(LNode* p, int e) {if (p == NULL) return false; // 判断合法 LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL) return false; // 内存分配失败 s->data = e;s->next = p->next;p->next = s;return true;
}// 指定结点的前插操作
bool InsertPriorNode(LNode* p, int e) {if (p == NULL) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL) return false;s->next = p->next;p->next = s;s->data = p->data; // 交换数值从而实现前插操作,方法还是后插的方法 p->data = e;return true;
}// 按位序删除结点并返回删除数据 
bool ListDelete(LinkList* L, int i, int* e) {if (i < 1) return false; // 判断操作合法LNode* p = *L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;} // 定位到删除结点if (p == NULL) return false;if (p->next == NULL) return false;LNode* q = p->next;*e = q->data;p->next = q->next;free(q);return true;
}// 创建方式
// 1. 头插法创建 O(n)
LinkList List_HeadInsert(LinkList* L) {*L = (LinkList)malloc(sizeof(LNode)); // 建立头结点(*L)->next = NULL;                    // 初始为空链表,这步不能少!int x;LNode* s;printf("input the x:");scanf("%d", &x);while (x != 9999) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = (*L)->next;(*L)->next = s;printf("Continue input the x:");scanf("%d", &x);}return *L;
}//指定结点的删除(重点理解) 
bool DeleteNode(LNode *p){if(p == NULL) return false;LNode *q=p->next;p->data=p->next->data;p->next=q->next;free(q);return true;
}//按位查找
LNode *GetElem(LinkList L,int i){if(i<1) return false;LNode *p=L->next;int j;while(p!=NULL && j<i-1){p=p->next;j++;}return p;
}//按值查找
LNode *LocateElem(LinkList L,int e){if(L == NULL) return false;LNode *p=L->next;while(p != NULL && p->data!=e){p=p->next;		}return p;
}//求单链表的长度
int length(LinkList L){int len=0;LNode *p=L;while(p->next!=NULL){p=p->next;len++;}return len;
} //创建方法 - 尾插法创建
//创建方法 - 尾插法创建
LinkList List_TailInsert(LinkList* L){int x;*L=(LinkList)malloc(sizeof(LNode));LNode *s,*r=*L;printf("输入插入的结点的值:");scanf("%d",&x);while(x != 9999){s=(LNode *)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;scanf("%d",&x);}r->next=NULL;return *L;
}//链表逆置(重点理解) 
LNode *Inverse(LNode *L){LNode *p,*q;p=L->next;L->next=NULL;while(p!=NULL){q=p;p=p->next;q->next=L->next;L->next=q;}return L;
}

测试代码

int main(void) {LinkList L = NULL;LNode *elem = NULL;int e=0;List_HeadInsert(&L);print(L);printf("Insert:\n");ListInsert(&L,2,3);	print(L);ListDelete(&L,3,&e);print(L);printf("Deleted elem:%d\n",e);printf("Delete the elem by Node\n");DeleteNode(L->next->next);print(L);printf("Search by position\n");elem=GetElem(L,3);printf("the elem is:%d\n",elem->data);printf("Inverse the Link\n");L=Inverse(L);print(L);return 0;
}

相关文章:

【考研】数据结构(更新到顺序表)

声明&#xff1a;所有代码都可以运行&#xff0c;可以直接粘贴运行&#xff08;只有库函数没有声明&#xff09; 线性表的定义和基本操作 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…...

汇编-指针

一个变量如果包含的是另一个变量的地址&#xff0c; 则该变量就称为指针(pointer) 。指针是操作数组和数据结构的极好工具&#xff0c;因为它包含的地址在运行时是可以修改的。 .data arrayB byte 10h, 20h, 30h, 40h ptrB dword arrayB ptrB1 dword OFFSET arrayBarray…...

常见Web安全

一.Web安全概述 以下是百度百科对于web安全的解释&#xff1a; Web安全&#xff0c;计算机术语&#xff0c;随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生&#xff0c;基于Web环境的互联网应用越来越广泛&#xff0c;企业信息化的过程中各种应用都架设在Web平台…...

milvus数据库搜索

一、向量相似度搜索 在Milvus中进行向量相似度搜索时&#xff0c;会计算查询向量和集合中具有指定相似性度量的向量之间的距离&#xff0c;并返回最相似的结果。通过指定一个布尔表达式来过滤标量字段或主键字段&#xff0c;您可以执行混合搜索。 1.加载集合 执行操作的前提是…...

HEVC参考帧技术

为了增强参考帧管理的抗差错能力&#xff0c;HEVC采用了参考帧集技术&#xff0c;通过直接在每一帧的片头码流中传输DPB中各个帧的状态变化&#xff0c;将当前帧以及后续帧可能用到的参考帧在DPB中都进行描述&#xff0c;描述以POC作为一帧的身份标识。因此&#xff0c;不需要依…...

QT小记:The QColor ctor taking ints is cheaper than the one taking string literals

这个警告意味着在使用 Qt 的 C 代码中&#xff0c;使用接受整数参数的 QColor 构造函数比使用接受字符串字面值的构造函数更有效率。 要解决这个警告&#xff0c;你可以修改你的代码&#xff0c;尽可能使用接受整数参数的 QColor 构造函数&#xff0c;而不是字符串字面值。例如…...

机器人走迷宫问题

题目 1.房间有XY的方格组成&#xff0c;例如下图为64的大小。每一个方格以坐标(x,y) 描述。 2.机器人固定从方格(0, 0)出发&#xff0c;只能向东或者向北前进&#xff0c;出口固定为房间的最东北角&#xff0c;如下图的 方格(5,3)。用例保证机器人可以从入口走到出口。 3.房间…...

轻量封装WebGPU渲染系统示例<36>- 广告板(Billboard)(WGSL源码)

原理不再赘述&#xff0c;请见wgsl shader实现。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BillboardEntityTest.ts 当前示例运行效果: WGSL顶点shader: group(0) binding(0) var<uniform> objMat :…...

Java 多线程进阶

1 方法执行与进程执行 GetMapping("/demo1")public void demo1(){//方法调用new ThreadTest1("run1").run();//线程调用new ThreadTest1("run2").start();} 下断点调试信息&#xff0c;可以看到run()方法当前线程是“main1” 继续运行到run里面&…...

CentOS上搭建SVN并自动同步至web目录

一、搭建svn环境并创建仓库&#xff1a; 1、安装Subversion&#xff1a; yum install svn2、创建版本库&#xff1a; //先建目录 cd /www mkdir wwwsvn cd wwwsvn //创建版本库 svnadmin create xiangmumingcheng二、创建用户组及用户&#xff1a; 1、 进入版本库中的配…...

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点&#xff0c;尤其适用于处理高并发业务和大量数据量的系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…...

使用cli批量下载GitHub仓库中所有的release

文章目录 1\. 引言2\. 工具官网3\. 官方教程4\. 测试用的网址5\. 安装5.1. 使用winget安装5.2. 查看gh是否安装成功了 6\. 使用6.1. 进行GitHub授权6.1.1. 授权6.1.2. 授权成功6.2 查看指定仓库中的所有版本的release6.2.1. 默认的30个版本6.2.2. 自定义的100个版本6.3 下载特定…...

深入分析TaskView源码之触摸相关

问题背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;android 10以后TaskView作为替代ActivityView的容器&#xff0c;在课程的分屏pip自由窗口专题也进行了相关的详细介绍分析。 这里再补充一下相关的TaskView和桌面内嵌情况下的触摸分析 主要问题点&#xff…...

键盘快捷键工具Keyboard Maestro mac中文版介绍

Keyboard Maestro mac是一款键盘快捷键工具&#xff0c;它可以帮助用户通过自定义快捷键来快速完成各种操作&#xff0c;提高工作效率。Keyboard Maestro支持多种快捷键组合&#xff0c;包括单键、双键、三键、四键组合等&#xff0c;用户可以根据自己的习惯进行设置。此外&…...

Dubbo开发系列

一、概述 以上是 Dubbo 的工作原理图&#xff0c;从抽象架构上分为两层&#xff1a;服务治理抽象控制面 和 Dubbo 数据面 。 服务治理控制面。服务治理控制面不是特指如注册中心类的单个具体组件&#xff0c;而是对 Dubbo 治理体系的抽象表达。控制面包含协调服务发现的注册中…...

周赛372(正难则反、枚举+贪心、异或位运算、离线+单调栈)

文章目录 周赛372[2937. 使三个字符串相等](https://leetcode.cn/problems/make-three-strings-equal/)模拟&#xff08;正难则反&#xff09; [2938. 区分黑球与白球](https://leetcode.cn/problems/separate-black-and-white-balls/)枚举 贪心 [2939. 最大异或乘积](https:/…...

存储区域网络(SAN)之FC-SAN和IP-SAN的比较

存储区域网络(Storage Area Network&#xff0c;SAN)用于将多个系统连接到存储设备和子系统。 早期FC-SAN&#xff1a; 采用光纤通道(Fibre Channel&#xff0c;FC)技术&#xff0c;通过光纤通道交换机连接存储阵列和服务器主机&#xff0c;建立专用于数据存储的区域网络。 传…...

Leetcode_45:跳跃游戏 II

题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返…...

给新手教师的成长建议

随着教育的不断发展和进步&#xff0c;越来越多的新人加入到教师这个行列中来。从学生到教师&#xff0c;这是一个华丽的转身&#xff0c;需要我们不断地学习和成长。作为一名新手老师&#xff0c;如何才能快速成长呢&#xff1f;以下是一名老师教师给的几点建议&#xff1a; 一…...

新手教师如何迅速成长

对于许多新手教师来说&#xff0c;迈出教学的第一步可能会感到非常困难。不过&#xff0c;通过一些关键的策略和技巧&#xff0c;还是可以快速提升教学能力的&#xff0c;我将为大家提供一些实用的建议&#xff0c;帮助各位在教育领域迅速成长。 深入了解学科知识 作为一名老师…...

竞赛选题 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…...

提升工作效率,使用AnyTXT Searcher实现远程办公速查公司电脑文件——“cpolar内网穿透”

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况&#xff0c;异地办公或者不在公司&#xff0c;想找…...

mybatis使用foreach标签实现union集合操作

最近遇到一个场景就是Java开发中&#xff0c;需要循环多个表名&#xff0c;然后用同样的查询操作分别查表&#xff0c;最终得到N个表中查询的结果集合。在查询内容不一致时Java中跨表查询常用的是遍历表名集合循环查库&#xff0c;比较耗费资源&#xff0c;效率较低。在查询内容…...

请问DasViewer是否支持与业务系统集成,将业务的动态的数据实时的展示到三维模型上?

答&#xff1a;一般这种是以平台的方式来展示&#xff0c;云端地球实景三维建模云平台是专门做这一块的&#xff0c;可前往云端地球官网免费使用。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,…...

[ruby on rails]rack-cors, rack-attack

gem rack-attack gem rack-cors1. rack-attack 可以根据ip、域名等设置黑名单、设置访问频率 设置黑名单 # 新增 config/initializers/rack_attack.rb # 请求referer如果匹配不上设置的allowed_origins&#xff0c;返回403 forbidden Rack::Attack.blocklist(block bad domai…...

猫12分类:使用多线程爬取图片的Python程序

本文目标 对于猫12目标检测部分的数据集&#xff0c;采用网络爬虫来制作数据集。 在网络爬虫中&#xff0c;经常需要下载大量的图片。为了提高下载效率&#xff0c;可以使用多线程来并发地下载图片。本文将介绍如何使用Python编写一个多线程爬虫程序&#xff0c;用于爬取图片…...

《深度学习500问》外链笔记

1.这个是什么意思...

机器学习技术栈—— 概率学基础

机器学习技术栈—— 概率学基础 先验概率、后验概率、似然概率总体标准差和样本标准差 先验概率、后验概率、似然概率 首先 p ( w ∣ X ) p ( X ∣ w ) ∗ p ( w ) p ( X ) p(w|X) \frac{ p(X|w)*p(w)}{p(X)} p(w∣X)p(X)p(X∣w)∗p(w)​ 也就有 p ( w ∣ X ) ∝ p ( X ∣ …...

使用Redis实现分布式锁

Hi, I’m Shendi 使用Redis实现分布式锁 需求场景 需要使用到分布式锁的场景非常多&#xff0c;例如抢单等并发场景&#xff0c;这里举一个例子。 有一个商品&#xff0c;限量出售100个&#xff0c;一个用户下单&#xff0c;数量就减少一个&#xff0c;当剩下最后一个时&…...

linux 服务器进程、端口查找,nginx 配置日志查找,lsof 命令详解

一 、根据端口号 查看文件的部署位置 1.1 使用查看端口号对应的进程信息 方式一 &#xff1a; 使用netstat命令 netstat -tuln | grep 端口号-t&#xff1a;显示TCP连接 -u&#xff1a;显示UDP连接 -l&#xff1a;仅显示监听状态的连接 -n&#xff1a;以数字形式显示端口…...