IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构笔记 -> 正文阅读

[数据结构与算法]数据结构笔记

数据结构

一、绪论

1、程序 = 算法 + 数据结构

2、基本概念和术语

1.数据:

所有能被输入到计算机中,且被计算机处理的符号的集合,是计算机操作的对象的总称。

2.数据元素

是数据(集合)中的一个“个体”,是数据的基本单位,由他若干个数据项 组成,也称为节点、元素、顶点和记录。

3.数据结构

是指互相之间存在着一种或多种关系的数据与元素的集合,或者说,其是带结构的数据元素的集合。

3、总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9kJKWt3-1634462352051)(C:\Users\lucky\AppData\Roaming\Typora\typora-user-images\1634455826975.png)]

二、线性表

1、定义

线性表是具有相同类型的 n (n>=0) 个元素的有限序列,其中 n 为表长,当 n=0 时,该表为空表。

typedef int ElemType; //定义别名
typedef int Status; //定义别名

typedef struct{
    ElemType *elem;        //存储空间基址
    int length;           //当前长度
    int listsize;         //当前分配的存储容量
}SqList;`

**备注:**笔者在进行数据结构学习的时候,对C++内容不熟悉,按照课本输入却报错,因为未定义或者未加头文件。

#include<stdlib.h>
#include<stdio.h>
#include <iostream>
using namespace std;

#define LIST_SZIE 1000     //线性表存储空间的初始分配量
#define LISTINCREMENT  10  //线性表存储空间的分配增量
#define OVERFLOW 1         //定义出错值
#define OK true            //定义OK返回值
#define Error 1            //定义ERROE返回值

2、操作

1.构建空线性表L

//为当前表分配空间
Status initLise_Sq(SqList &L){
    //构建空的线性表LS
  //  L.elem=(ElemType *) malloc(LIST_SZIE*sizeof(ElemType));
  L.elem = (ElemType *)malloc(LIST_SZIE * sizeof(ElemType));
    if(!L.elem)
        exit(OVERFLOW);    //分配失败
    L.length=0;            //空表长度为0
    L.listsize=LIST_SZIE;  //初始存储容量
    return OK;
}

2.清空线性表

初始条件:线性表存在
操作结果:清空线性表(将当前元素个数赋值0,遍历不出任何一个元素,相当于清空线性表)

Status ClearList(SqList &L)
{
    L.length=0;
    return Ok;
}

3.结构销毁

初始条件:线性表已存在
操作结果:销毁线性表

Status Destroy(SqList &L)
{
    free(L.elem);
    L.elem=NULL;
    L.length=0;
    L.listsize=0;
    return OK;
}

4.判空线性表

初始条件:线性表存在
操作结果:线性表为空返回true,不为空返回false

bool ListEmpty(SqList L)//不需要对线性表的成员变量进行改变,所以不使用引用
{
    return (L.length==0)?true:false;
}

5.返回长度

初始条件:线性表已存在
操作结果:返回线性表当前元素个数

int ListLength(SqList L)
{
    return L.length;
 }

6.获得指定位置的数据元素

初始条件:线性表存在
操作结果:获得指定位置的数据元素并赋值给e

Status GetElem(SqList L,int i, ElemType &e)
{
    if(i<1||i>L.length)
    exit(error);
    e=*(L.elem+i-1);//(基址+i-1)即为第i个元素的地址
    return OK;
}

7.定位元素(获得符合一定条件的数据元素的位序)

初始条件:线性表已存在
操作结果:返回L中第一个与e满足关系的元素的位序,若不存在返回0
(注意:compare()表示一个关系判定函数,满足返回值为1,否则返回值为2,使用函数指针,方便调用)

int LocateElem(SqList L,ElemType e,status(*compare)(ElemType,ElemType))
{
    Elem *p=L.elem; //P的初值为第一个元素的存储位置
    int i=1;//i的初值为第一个元素的位序
    while(i<=L.length&&!compare(*p++,e)){//越界或已找到满足条件的元素
    //i的最大可能值为L.length+1
        i++;
    }
    if(i<=L.length)
        return i;
    else
        return 0;
}

8.返回前驱

初始条件:线性表已存在,数据元素存在前驱
操作结果:查找数据元素,若线性表中有该元素且前驱存在,将前驱拷贝给一个与数据元素数据类型相同的变量;若前驱不存在,上述变量无定义

//返回前驱,equal要提前声明 
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
   int a;
   a=LocateElem(L,cur_e,equal);
   if(!a||a==1)
   {
   	cout<<"查找失败"<<endl;
   	return error;
   }
   pre_e=*(L.elem+a-2);
   return OK;
 }

9.返回后继

初始条件:线性表已存在,数据元素存在后继
操作结果:查找数据元素,若线性表中有该元素且后继存在,将后继拷贝给一个与数据元素数据类型相同的变量;若后继不存在,上述变量无定义

Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{
    int a;
    a=LocateElem(L,cur_e,equal);
    if(!a||a==L.length)
    {
   	  cout<<"查找失败"<<endl;
      return error;
    }
    next_e=*(L.elem+a);
    return OK;
    
 }

10.插入元素

初始条件:线性表存在
操作结果:在L中第i个元素之前插入新的元素e,L的长度加1

//插入
Status ListInsert_Sq(SqList &L,int i,ElemType e){
    //判断空间合理性
    if(i<L.length||i>L.length)   //位置不合理
        return Error;
    if(L.length>LIST_SZIE){      //当前存储空间已满,增加分配
        ElemType *newbase=(ElemType *)malloc((LIST_SZIE+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
            exit(OVERFLOW);
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
  q = &(L.elem[i-1]);
        for(p=&(L.elem[L.length]);p>q;--p){
            *(p+1)=*p;//给插入位置之后的元素赋值达到之后元素后移一位的效果
        }

        *(p+1)=e;//插入e
        ++L.length;
        return OK;
}

备注:笔者在测试时发现元素后移时p指针必须指向最后一位元素,即ElemType p=&(L.elem[L.length]),插入e时(p+1)=e

11. 删除元素

初始条件:线性表已存在
操作结构:删除第i个数据元素并返回其值,L的长度减1

Status ListDelete(SqList &L,int i,ElemType &e)
{
    ElemType *p,*q;
    if(i<1||i>L.length)//i值不合法
    return error;
    p=L.elem+i-1;//p为被删除元素的位置
    e=*p;//被删除元素的值赋给e
    q=L.elem+L.length-1;//表尾元素的位置
    for(++p;p<=q;++p)
    *(p-1)=*p;
    L.length--;
    return OK;
}   

12.遍历线性表

初始条件:线性表已存在
操作结果:依次对L的每个元素使用函数f(),f()可以是输出函数,一旦操作失败,则操作失败

Status ListTraverse(SqList L, void(*f)(ElemType&))
{
    ElemType *p=L.elem;
    int i;
    for(i=1;i<=L.length;i++)
          f(*p++);
    cout<<endl;
    return OK;
  }

13.判满线性表

初始条件:线性表村子啊

操作结果:若线性表已满返回true,否则返回false

bool ListFull(SqList L)
{
    return (L.length==L.listsize)?true:false;
}

测试:

 int j,e;
    SqList L;
    initLise_Sq(L);
    cout<<"请输入线性表的长度:"<<endl;
	cin>>L.length;
	cout<<"请依次输入线性表的元素:"<<endl;
	for(int i=1;i<=L.length;i++)
		cin>>L.elem[i];
    cout<<"请输入想要插入的元素的位置(几号元素之前):"<<endl;
	cin>>j;
	cout<<"请输入想要插入的元素:"<<endl;
	cin>>e;
	ListInsert_Sq(L,j,e);
    cout<<"插入元素后线性表的序列为:"<<endl;
	for(int i=1;i<=L.length;i++)
		cout<<L.elem[i]<<" ";

    return 0;

运行结果:

线性表
输出
&L.elem[1]:0
&L.elem[2]:0xfc5f48
n:0

还待更新…

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-18 17:38:08  更:2021-10-18 17:38:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:39:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码