news 2026/4/7 18:08:00

数据结构与算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构与算法

首先给出一些宏定义

#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef char ElemType;

1. 线性表的顺序存储(顺序表)

1.静态顺序表与动态顺序表

// 定义静态顺序表的最大容量 #define MAXSIZE 100 // 静态顺序表结构体 typedef struct { ElemType elem[MAXSIZE]; // 存储数据元素的数组,ElemType为char(来自之前的定义) int length; // 记录顺序表当前的实际长度(注意:length ≤ MAXSIZE) } SqList;
// 动态顺序表结构体 typedef struct { ElemType *elem; // 指向动态分配内存的指针,用于存储数据元素 int length; // 顺序表当前的实际长度 int capacity; // 顺序表当前的最大容量(已分配的内存大小) } SqList;

2.初始化顺序表

Status InitSqList(DynamicSqList *L, int initCapacity) { // 合法性校验 if (initCapacity <= 0) { return ERROR; } // 动态分配内存 L->elem = (ElemType *)malloc(initCapacity * sizeof(ElemType)); //或者L->elem = new ElemType[initCapacity] // 内存分配失败 if (L->elem == NULL) { return OVERFLOW; // OVERFLOW=-2(来自宏定义),表示内存溢出 } // 初始化参数 L->length = 0; // 初始实际长度为0 L->capacity = initCapacity; // 初始容量为指定值 return OK; }

3.向顺序表指定位置插入元素

Status InsertSqList(SqList &L, int pos, ElemType e){ // 1. 合法性校验:L不为空、pos位置合法、顺序表未满 if (L == NULL || pos < 1 || pos > L->length + 1 || L->length >= L->capacity) { return ERROR; } //2.移动元素,将pos后的元素向后移动一位 for(int i = L->length; i >= pos; i--){ L->elem[i] = L->elem[i--}; } //3.插入新元素 L->elem[pos - 1] = e; //4.更新数组长度 L->length++; return Ok; }

4.删除顺序表指定位置元素

Status DeleteSqList(SqList &L, int pos){ // 1. 合法性校验:L不为空、pos位置合法、顺序表未满 if (L == NULL || pos < 1 || pos > L->length || L->length == 0) { return ERROR; } //2.将pos后的元素向前移动一位 for(int i = pos-1; i < L->length; i++){ L->elem[i] = L->elem[i + 1}; } //3.更新数组长度 L->length--; return Ok; }

5.查找顺序表中指定元素

Status LocateSqList(SqList &L, ElemType e){ // 1. 合法性校验:L不为空 if (L == NULL || L->length == 0) { return ERROR; } //2.顺序遍历查找 for(int i = 0; i < L->length; i++){ if(L->elem[i] = e){ return i + 1; } //3.未找到指定元素 return 0; }

2.线性表的链式存储

1. 写出结构体定义

typedef struct student{ char num[8]; //学号 char num[8]; //姓名 int sore; //分数 struct student *next; //指针域 } Lnode, *LinkList;

或者一般分开写

typedef Struct student{ char num[8]; //学号 char num[8]; //姓名 int sore; //分数 } ElemType; typedef Struct Lnode{ ElemType data; //数据域 Struct Lnode *next; //指针域 } Lnode, *LinkList;

2.初始化链表

LinkList InitList(LinkList &L){ LinkList L = new Lnode; //或者 LinkList L = (LinkList)malloc(sizeof(Lnode)); if(L == NULL){ cout << "内存分配失败" << endl; return NULL: } L->next = NULL; //头结点的 指针域初始化为空 return L; }

3.判断链表是否为空

Status ListEmpty(LinkList &L){ if(L->next != NULL) return 0; else return 1; }

4.销毁单链表

Status DestoryList_L(LinkList &L){ Lnode *p; //或者LinkList p; while (L != NULL){ p = L; L = L->next; //头节点后移 delete P; } return OK; }

5.清空链表

Status ClearList(LinkList &L){ Lnode *p, *q; p = L->next; while(p){ q = p->next; delete p; p = q; } L->next = NULL; return OK; }

6. 链表表长

int Listlength(LinkList &L){ Lnode *p; p = L->next; int i = 0; while(p){ i++; p = p->next; } return 0; }

7.获取链表中某个位置的元素

Status GetElem(LinkList &L, int i, ElemType &e){ Lnode *p = L->next; int j = 1; while( p && j < i){ p = p->next; j++; } if(!p || j >i) return ERROR; e = p->data; return OK; } //或者(这个不如上一个优) Status GetElem(LinkList &L, int i, ElemType &e){ Lnode *p = L->next; if(i < 1) return ERROR; for(int j = 1; j < i && p; j++){ p = p->next; } if(!p) return ERROR; e = p->data; return OK; }

8.查找链表中的某个元素

\\返回地址 Lnode* LocateElem(LinkList &L, ElemType e){ Lnode *p = L->next; while(p->data != e && p){ p = p->next; } return p; } \\返回位置序号 int LocateElem(LinkList &L, ElemType e){ Lnode *p = L->next; int j = 1; while(p->data != e && p){ p = p->next; j++; } if(p) return j; return 0; }

9.在链表中某个位置插入元素

Status ListInsert(LinkList &L, int i, ElemType e){ int j = 0; Lnode *p = L; while(p && j < i-1){ p = p->next; j++; } if(!p || j > i-1) return ERROR; Lnode *s = new Lnode; s->next = p->next; p->next = s; return OK; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 4:09:52

vivado2022.2安装全流程图文并茂的系统学习资料

Vivado 2022.2 安装实战全攻略&#xff1a;从零搭建高效 FPGA 开发环境 你是否曾因为 Vivado 安装失败而耽误项目进度&#xff1f;是否在下载器卡在 0% 时束手无策&#xff1f;又或者&#xff0c;好不容易装上了却提示“License Checkout Failed”&#xff1f; 别担心&#x…

作者头像 李华
网站建设 2026/3/23 8:49:00

STM32 GPIO控制有源蜂鸣器操作指南

蜂鸣器也能玩出花&#xff1f;用STM32一个GPIO口搞定报警提示音你有没有遇到过这样的场景&#xff1a;调试一块新板子&#xff0c;上电后啥反应都没有——LED不闪、屏幕不亮、串口没输出。这时候要是有个“滴”一声的启动音&#xff0c;至少能告诉你&#xff1a;芯片是活的&…

作者头像 李华
网站建设 2026/4/6 1:37:29

核谱回归(Kernel Spectral Regression)算法详解与MATLAB实现

核谱回归(Kernel Spectral Regression)算法详解与MATLAB实现 在机器学习和数据降维领域,谱回归(Spectral Regression, SR)是一种高效的子空间学习方法,它通过将传统的谱嵌入问题转化为一系列回归问题,大大降低了计算复杂度。当数据分布复杂、呈现非线性结构时,我们常常…

作者头像 李华
网站建设 2026/3/31 13:38:09

基于STM32的u8g2 OLED驱动配置:手把手教程

从零构建STM32 OLED图形界面&#xff1a;u8g2驱动的深度实践与工程优化你有没有遇到过这样的场景&#xff1f;项目里需要加一个小型显示屏&#xff0c;显示点温度、状态或菜单。第一反应是接个LCD&#xff1f;但视角窄、对比度低、还要背光控制……太麻烦。于是你把目光转向OLE…

作者头像 李华
网站建设 2026/4/7 7:47:35

Nginx--日志(介绍、配置、日志轮转)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式&#xff0c;每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…

作者头像 李华
网站建设 2026/4/7 8:29:32

LTspice 仿真验证正交线圈互感对于信号幅值的影响

简 介&#xff1a; 本文通过LTspice仿真研究了正交电感线圈的互感特性及其对角度测量的影响。仿真结果表明&#xff1a;1&#xff09;当两线圈存在互感时&#xff0c;其信号幅度会随磁场角度变化产生关联&#xff1b;2&#xff09;谐振电容取值差异会导致两路信号输出幅度不同&…

作者头像 李华