02——线性表

线性表

基本操作

Initlist(&L):初始化表
Length(L):求表长
LocateElem(L,e):按值查找操作
GetElem(L,i):按位查找操作
ListInsert(&L,i,e):插入操作
ListDelete(&L,i,&e):删除操作
PrintList(L):输出操作
Empty(L):判空操作
DestroyList(&L):销毁操作

顺序表

静态分配的顺序表存储结构

#define Maxsize 50
typedef struct{ElemType data[Maxsize];int length;
}SqList;

动态分配的顺序表存储结构

#define InitSize 100
typedef struct{ElemType *data;int Maxsize,length;
}SeqList;
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);或
L.data=new ElemType[InitSize];

增加动态数组的长度 

#include <stdlib.h>
#define InitSize 10
typedef struct{int *data;int Maxsize,length;
}SeqList;int main(){SeqList L;IniList(L);...IncreaseSize(L,5);return 0;
}//初始化一个动态数组
void InitList(SeqList &L){L.data=(int*)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}//增加动态数组的长度
void IncreaseSize(SeqList &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];//注意访问p指针指向的数组}L.MaxSize=L.MaxSize+len;free (p);
}

静态分配顺序表的初始化

void InitList(SqList &L){for(int i=0;i<MaxSize;i++){L.data[i]=0;}L.length=0;
}
或者
void InitList(sqList &L){L.length=0;
}

动态分配顺序表的初始化

void InitList(SeqList &L){L.data=(ElemType*)malloc(InitSize*sizeof(ElemType));L.length=0;L.MaxSize=InitSize;
}

插入操作(位置在1~L.length+1之间)

bool ListInsert(SqList &L,int i,ElemType e){if(i<1||i>L.length+1)return false;if(L.length>=MaxSize)//存储空间满return false;for(int j=L.length;j>=i;j--)L.data[j]=L.data[j-1];//第i个元素后的元素后移L.data[i-1]=e;L.length++;return true;
}

删除操作(位置在1~L.length之间)

bool ListDelete(SqList &L,int i,ElemType &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];//第i个元素后的元素前移L.length--;return true;
}

按值查找

int LocateElem(SqList L,ElemType e){int i;for(i=0;i<L.length;i++)//若为i<InitSize,则初始化要全部初始化为0,防止脏数据影响if(L.data[i]==e)  return i+1;//返回位序i+1return 0;
}

按位查找(静态分配和动态分配一样)

ElemType GetElem(SqList L,int i){return L.data[i-1];
}
补充:结构体的比较不能直接用==,应该一个一个元素比较。

链表

单链表

单链表节点结构

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
相当于
struct LNode{ElemType data;struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;LNode *L;//表明这是一个指向单链表第一个结点的指针,强调结点
LinkList L;//同上,更强调链表

单链表的初始化及判空(带头结点)

bool InitList(LinkList &L){L=(LNode*)malloc(sizeof(LNode));//分配第一个头结点if(L==NULL) return false; //内存不足,分配失败L->next=NULL;return true;
}bool Empty(LinkList L){if(L->next==NULL) return true;else return false;
}

单链表的初始化及判空(不带头结点)

bool InitList(LinkList &L){L=NULL;return true;
}bool Empty(LinkList L){if(L==NULL) return true;else return false;
}
或者
bool Empty(LinkList L){return (L==NULL):
}

求表长操作(带头结点)

int length(LinkList L){int len=0;//计数变量LNode* p=L;while(p->next!=NULL){p=p->next;len++;}return len;
}

按序号查找

LNode* GetElem(LinkList L,int i){if(i<0) return NULL;LNode *p=L;int j=0;//记录当前结点的位序,头结点为第0个结点,方便把结点插在第1个位置while(p!=NULL&&j<i){p=p->next;j++;}return p;//返回指向第i个结点的指针或NULL
}

按值查找

LNode *LocateElem(LinkList L,ElemType e){LNode *p=L->next;while(p!=NULL&&p->data!=e){p=p->next;}return p;//找到则返回该结点指针,否则返回NULL
}

按位序插入(带头结点)

bool ListInsert(LinkList &L,int i,ElemType e){if(i<1) return false;LNode *p=L;int j=0;//头结点是第0个结点while(p!=NULL&&j<i-1){//找到第i-1个结点p=p->next;j++;}if(p==NULL) return false;//i值不合法LNode *s=(LNode*)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return true;
}

按位序插入(不带头结点)

bool ListInsert(LinkList &L,int i,ElemType e){if(i<1) return false;if(i==1){//仅第1一个结点与带头结点的操作不同LNode *s=(LNode*)malloc(sizeof(LNode));s->data=e;s->next=L;L=s;return true;}LNode *p=L;int j=1;//没有头结点了while(p!=NULL&&j<i-1){//找到第i-1个结点p=p->next;j++;}if(p==NULL) return false;//i值不合法LNode *s=(LNode*)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return true;
}

指定结点的后插操作 

bool InsertNextNode(LNode *p,ElemType e){//在p结点之后插入元素eif(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,ElemType 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;
}

按位序删除(带头结点)

 

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

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

相关文章

【JavaScript】数据类型转换

JavaScript 中的数据类型转换主要包括两种&#xff1a;隐式类型转换&#xff08;Implicit Type Conversion&#xff09;和显式类型转换&#xff08;Explicit Type Conversion&#xff09;。 1. 隐式类型转换&#xff08;自动转换&#xff09;&#xff1a; js 是动态语言&…

Docker搭建LNMP+Wordpress的实验

目录 一、项目的介绍 1、项目需求 2、服务器环境 3、任务需求 二、Linux系统基础镜像 三、部署Nginx 1、建立工作目录 2、编写Dockerfile 3、准备nginx.conf配置文件 4、设置自定义网段和创建镜像和容器 5、启动镜像容器 6、验证nginx 三、Mysql 1、建立工作目录…

Kalign 3:大型数据集的多序列比对

之前一直用的是muscle&#xff0c;看到一个文章使用了Kalign&#xff0c;尝试一下吧 安装 wget -c https://github.com/TimoLassmann/kalign/archive/refs/tags/v3.4.0.tar.gz tar -zxvf v3.4.0.tar.gz cd kalign-3.4.0 mkdir build cd build cmake .. make make test su…

C++ 中 shared_from_this()的原理与使用

什么是shared_from_this()&#xff1f; 它是一个模板类&#xff0c;定义在头文件 <memory>&#xff0c;其原型为&#xff1a; template< class T > class enable_shared_from_this;std::enable_shared_from_this能让其一个对象&#xff08;假设其名为 t &#xf…

【数据结构与算法】之五道链表进阶面试题详解!

目录 1、链表的回文结构 2、相交链表 3、随机链表的复制 4、环形链表 5、环形链表&#xff08;||&#xff09; 6、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知…

【48天笔试强训】day18

题目1 描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…

力扣数据库题库学习(5.6日)--1729. 求关注者的数量

1729. 求关注者的数量 问题链接 思路分析 编写解决方案&#xff0c;对于每一个用户&#xff0c;返回该用户的关注者数量。 按 user_id 的顺序返回结果表。示例 1&#xff1a;输入&#xff1a; Followers 表&#xff1a; ---------------------- | user_id | follower_id | -…

【搜索技能】外链

文章目录 前言一、外链是什么&#xff1f;二、如何进行外链调查&#xff1f;总结 前言 今儿因为在搜索一个很感兴趣的软件&#xff0c;但是软件信息所在的网址非常有限。因此产生了一个念头&#xff1a;我能不能找到所有的包含了或者是引用了这个网站的网站呢? 调查之下&…

C语言面试重点问题

1. 冒泡排序法 2. strlen、strcpy、strcat、strcmp的用法和原理 3. 大小端的区分 3.1 主函数区分大小端 #include <stdio.h>int main(void) {int num 0x11223344;char *p (char *)&num;if (0x11 *p){printf("大端!\n");}else if (0x44 *p){printf(…

解密SSL/TLS:密码套件扫描仪的深度解析(C/C++代码实现)

解密SSL/TLS流量通常是为了分析和审计加密通信&#xff0c;以确保数据传输的安全性和合规性。密码套件扫描仪是实现这一目的的一种工具&#xff0c;它可以提供关于SSL/TLS配置的详细信息&#xff0c;帮助安全专家评估潜在的风险。 SSL/TLS协议基础 SSL/TLS协议是网络安全中不…

select,poll,epoll

在 Linux Socket 服务器短编程时&#xff0c;为了处理大量客户的连接请求&#xff0c;需要使用非阻塞I/O和复用&#xff0c;select&#xff0c;poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…

C语言/数据结构——每日一题(环形链表的约瑟夫问题)

一.前言 今天在牛客网上面看到了一道环形链表题&#xff0c;想着和大家们分享一下。可能我有点笨&#xff0c;那道题的链接我没搞好&#xff0c;所以很抱歉&#xff0c;只能麻烦大家们看一下截屏的题目信息了。废话不多数&#xff0c;让我们开始今天的题目分享吧。 二.正文 …

ComfyUI中的图像稀释处理

用下面的节点对图片进行稀释处理&#xff0c;如下 为0表示不变&#xff0c;我设置大一点&#xff0c;设置为0.5看看&#xff0c;如下 图像就暗淡了一些&#xff0c;但是还是有一些彩色的&#xff0c;相当于把它放在水里浸泡了一样&#xff0c;掉色了&#xff0c;这就是稀释&…

Android面试必考题16-30

目录 16.Handler 机制 17.android 事件分发机制、 18.子线程发消息到主线程进行更新 UI,除了 handl

公网tcp转流

之前做过几次公网推流的尝试, 今天试了UDP推到公网, 再用TCP从公网拉下来, 发现不行, 就直接改用TCP转TCP了. 中间中转使用的python脚本, 感谢GPT提供技术支持: import socket import threadingdef tcp_receiver(port, forward_queue):"""接收TCP数据并将其放入…

linux之NAMP

linux之NAMP Nmap&#xff08;Network Mapper&#xff09;是一个开源的网络扫描和安全审计工具。它被设计用来快速地扫描大型网络&#xff0c;尽管它也可以对单个主机进行有效的扫描。Nmap利用原始IP数据包以多种方式探测目标网络上的主机、服务&#xff08;应用程序名称和版本…

LLM应用:工作流workflow创建自定义模版使用

参考: https://www.coze.cn/ 本案例是在coze平台上操作的,也有其他工具支持工作流的创建例如dify;也例如图像生成的comfyui工作流工具 创建自定义模版 可以根据自己需求创建自己的工作流工具;本文案例是创建一个联网搜索的LLM应用: 创建工作流页面: https://www.coze.c…

X 推出 Stories 功能,由 Grok AI 生成新闻摘要

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

工厂模式+策略模式

输入实体 基类 import lombok.Data;Data public class PersonInputDto {private Integer id;private String name; }子类 Data AllArgsConstructor NoArgsConstructor public class ManPerson extends PersonInputDto {private String sex; }Data AllArgsConstructor NoArgs…

嵌入式学习day11

每日面试题 全局变量可不可以定义在可被多个.c文件包含的头文件中&#xff0c;为啥&#xff1f; 可以&#xff0c;在不同的C文件中各自用static声明的全局变量&#xff0c;变量名可能相同&#xff0c;但是各自C文件中的全局变量的作用域为该文件&#xff0c;所以互不干扰。 …