首页 > 编程语言 >C / C++ Data Structure

C / C++ Data Structure

时间:2023-07-19 18:24:41浏览次数:31  
标签:ch nextval int data C++ ++ Data Structure size

  • 用低劣的水平描述数据结构的东西,后续考研还要细学
  • 目前主要加深对数据结构的理解,大体过一遍,如果你质疑我的文章,那一定是我错了,我会忽略一些专业术语,更偏向于自己的理解思考
  • 对于初学者来说可能会有一定的帮助

前置

  • 一堆概念
    • 数据:客观事物的符号描述
    • 数据元素:数据的基本单位
    • 数据项:组成数据元素的、有独立含义的、不可分割的最小单位
    • 数据对象:性质相同的数据元素的集合
  • 逻辑结构
    • 线性与非线性
    • 线性、树、图、集合
  • 存储结构
  • 散列与性能分析
为什么学习数据结构?
  • 学习数据结构和算法,并非为了死记硬背几个知识点。而是为建立时间复杂度、空间复杂度意识,写出高质量代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。 掌握数据结构与算法,看待问题的深度,解决问题的角度就会完全不同。

线性表

顺序表

前哨

输入特殊值后,表示输入结束的特殊值为前哨。

typedef

语句格式
typedef 实存类型 类型别名

一系列操作

定义的结构体

typedef struct
{
	Type* data;
	int max;
	int size;
}Seqlist
尾插

插入前判断一下是否需要扩展空间,需要的话执行

void Reserve(Seqlist * l,int newmax)
{
	int i ;
	Type * old;
	if(newmax <= l->max)
		return ;
	old = l -> data;
	l -> max = newmax;
	l -> data = (Type *) malloc (newmax * sizeof(Type));
	for(int i = 0 ; i < l -> size ; i ++)
		l -> data[i] = l -> old[i];
	free (old);
}

尾插操作

void PushBack(Seqlist * l ,Type item)
{
	if(l -> size == l -> max)
		Reserve(l,2*max);
	l -> data[l -> size ] = item;
	l -> size++;
}

进行读取操作时,指针前面加const可以确保不会修改数据

删除
void Erase(Seqlist * l , int id)//删除第id元素
{
	int i ;
	for(i = id +1 ; i < l -> size ; i ++)
		l -> data[i-1] = l -> data[i];
	l ->size --;
}
定点插入
void intsert(Seqlist* l ,int id , Type item)
{
	int i;
	if(l -> size == l -> max)
		Reserve(l,2*l -> max);
	for(i = l -> size-1 ; i >= id ; i --)
		l -> data[i+1] = l -> data[i];
	l -> data[id] = item;
	l -> size ++;
}

链表

单链表
循环链表
双向链表
链表逆置
将第二个结点及以后节点进行遍历,执行先首插再删除的操作,直到next==last

栈和队列

栈(先进先出)

  • 没什么说的

队列

  • 普通队列 queue
  • 循环队列
  • 双向队列 deque
  • 优先队列 priority_queue

KMP字符串匹配

  • 根据模式串t,求出next数组(只与模式串有关,与主串无关),利用next数组进行匹配,当匹配失败时,主串的指针 i 不再回溯!
  • 所谓next,就是每个字符的最长相同前后缀,代码上注意递归求解即可

结构体设置

#define MAXSIZE 1024
typedef struct{
    char ch[MAXSIZE+1];		//字符串
    int length;			//长度
}String;

求解next数组

void Get_Next(String t, int nextval[])
{
    nextval[0] = -1;
    int i = 0, j = -1;
    while(i < t.length){
        //相同前后缀,进入判断
        if(j == -1 || t.ch[i] == t.ch[j]){
            i++, j++;						//修改位置
            if(t.ch[i] != t.ch[j])
                nextval[i] = j;				//不相等,直接取值             
            else
                nextval[i] = nextval[j];    //相等,无意义,再次向前求解
        }else
            j = nextval[j];      //非相同前后缀,向前递归
    }
}

KMP

int KMP(String s, String t)
{
    int nextval[MAXSIZE+1];
    Get_Next(t, nextval);		             //求解nextval
    int i = 0, j = 0;
    while(i < s.length && j < t.length){
        if(j == - 1 || s.ch[i] == t.ch[j]){  //相同,可匹配
            i++, j++;
        }else							     //不可匹配,向前追溯
            j = nextval[j];
    }
    //输出匹配位置
    if(j >= t.length)
        return i - t.length + 1;	//输出实际位置长度,非数组下标
    return 0;
}

标签:ch,nextval,int,data,C++,++,Data,Structure,size
From: https://www.cnblogs.com/blacksmith-Jia/p/17558341.html

相关文章

  • Embedding into a shared library fails-- c++ import numpy异常
    rb reportatbugs.python.orgWedNov2610:13:39CET2008 Previousmessage: [New-bugs-announce][issue4433]_ctypes.COMErrorcrashNextmessage: [New-bugs-announce][issue4435]SphinxdoesnotshowfaileddoctestsinquietmodeMessagessortedby: [da......
  • <data android:scheme= 可以填多个吗
    Android中的Scheme在Android开发中,Scheme是一种用于标识应用程序组件之间通信的协议。它允许应用程序通过特定的URL来启动其他应用程序或执行特定的操作。Scheme通常用于实现应用程序内部的深层链接或与外部应用程序的交互。Scheme的基本概念在Android中,Scheme是通过在Intent中......
  • django中request.query_params.get()和 request.data.get()的区别
    params用于获取字符串,data:用于获取正文,post方法两个参数都可以使用,get方法只能使用params例如:name=request.query_params.get('name',None)如果URL的查询参数中包含了名为"name"的参数,那么request.query_params.get('name',None)将返回该参数的值。否则,将返回None......
  • C/C++以太网布网及故障检测模拟[2023-07-19]
    C/C++以太网布网及故障检测模拟[2023-07-19]“数据结构与算法综合设计”任务书专业:计算机与软件工程学院所有专业年级:2021一、 设计题目以太网布网及故障检测模拟二、 设计内容【问题描述】某个以太网内有n台计算机,由于搭建以太网时工作人员的疏忽,现......
  • C/C++数据结构课程设计题目[2023-07-19]
    C/C++数据结构课程设计题目[2023-07-19]数据结构课程设计题目基本要求:1、每人1题,如果系统具有界面以及功能复杂,可以2人合作一题。2、可以自拟题目,难度不低于给定题目,且自拟的题目需要经过老师审核通过。3、要求实现一个界面美观、功能完整、具有实用性的系统。4、不限制......
  • c++笔记-scoped_lock/unique_lock解析
    目录scoped_lockvsunique_lock灵活性生命周期资源所有权性能对比例源码unque_lockscoped_lockscoped_lockvsunique_lock在C++中,std::scoped_lock和std::unique_lock都是用来管理互斥量(mutex)的RAII(ResourceAcquisitionIsInitialization)类,用于简化多线程编程中的锁管理。它......
  • docker run -d --name bitwarden -v /bw-data/:/data/ -p 8800:80 bitwardenrs/se
    DockerRun命令实现Bitwarden容器化引言在现代软件开发和部署中,容器化技术正变得越来越流行。Docker是一个用于构建、发布和运行应用程序的开源平台,它可以将应用程序及其依赖项打包到一个容器中,提供了一种轻便、可移植和可扩展的方式来部署应用程序。在本文中,我们将学习如何使用......
  • C++ 虚基类
    虚基类(VirtualBaseClass)在面向对象编程中的作用是解决多重继承中的菱形继承问题(DiamondInheritanceProblem)和共享基类问题(SharedBaseClassProblem)。菱形继承问题是指当一个类以多种路径继承自同一个基类时,会导致该基类在派生类中存在多个实例,造成冗余和二义性。虚基类通过......
  • .net 事务(_dbContext、Database)
     //开启事务vartran=_dbContext.Database.BeginTransaction();try{ _dbContext.SaveChanges();//提交事务tran.Commit();}catch(Exceptionex){......
  • LOADING Redis is loading the dataset in memory
     MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror LOADINGRedisisloadingthedatasetinmemory......