数据结构学习笔记

第一章 绪论

1.1课程介绍

--逻辑结构:数据与数据之间的关系

--存储结构:存储数据的方法

--算法:解决问题的方法

1.2基本概念

1.按某种逻辑关系组织起来的一批数据 例如:线性表、树、图。

2.以一定的方式存于计算机中 例如:数组、链表等。

3.在这组数据上定义了运算的集合 例如:插入、删除、查找、排序等。

数据与数据元素

数据(data):能够输入到计算机中并被计算机程序处理的信息,包括文字、表格、图像等,都称为数据。

  • 数据元素(data element):数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

    一个数据元素包括若干个数据项(data item)。

  • 数据元素、数据项和数据的逻辑结构在计算机中的表示又称为结点、数据域和存储(物质)结构。

数据的逻辑关系

---数据元素之间的逻辑关系

  1. 线性结构

    元素之间的关系是一对一的。

  2. 树型结构

    元素之间的关系是一对多的。

  3. 图状结构

    元素之间的关系是多对多的。

数据的存储结构

---数据在计算机中的存储表示

1.顺序存储(数组)

​ 例如:long a[20];

图片说明

2.非顺序存储
图片说明

3.索引存储

图片说明

4.散列存储
图片说明

数据的运算

插入、删除、查找、排序等。

数据类型(Data Type)

一个值的集合及定义在这个集合上的一组操作总称

关键码(key)

数据元素中能起作用的数据项,其中,能起唯一标识作用的关键码称为“主关键码(主码)“

1.3算法分析

算法与程序

算法(Algorithm):是解决问题的一种方法(策略)或一个过程。

程序:用计算机语言实现算法。

算法设计的要求

(1)正确性(correctness)

(2)可读性(readablility)

(3)健壮性(robustness)

(4)高效率与低存储量

算法分析

(1)时间复杂度 --指算法中各语句执行时间的总和

(2)空间复杂度 --算法中所需占用的空间

第二章 线性表

2.1线性表的定义

定义

​ n(n>=0)个数据元素的有限序列。可表示为:(a1,a2,a3,...,an)

​ a1~an是n个数据元素 n表示线性表的长度,n=0时为空表

表示形式

可表示为:(a1,a2,a3,...,an)

还可以表示为二元组形式:(D,S) {D表示元素集合,S表示关系集合:前驱后继}

​ D={a1,a2,a3,...,an}

​ S={(a1,a2),(a2,a3),...,(an-1,an)}

元素关系

对于非空线性表(a1,a2,a3,...,an)

  • 有且仅有一个开始节点a1,它没有前驱,而仅有一个后继a2
  • 有且仅有一个中端节点an,它没有后继,而仅有一个前驱an-1
  • 其余的内部节点ai(i>=2&&i<=n-1)都有且仅有一个前驱节点ai-1和一个后继节点ai+1

2.2顺序表

顺序存储结构

存储结构

数据结构在计算机中的表示,包括数据元素的表示和关系的表示。

数据元素之间的关系在计算机中有两种不同的表示方法

  • 顺序存储结构----顺序表
  • 链式存储结构----链表

顺序存储

图片说明

图片说明

#define MAXSIZE 100    //数组最大下标
typedef struct
{
    ElemType a[MAXSIZE+1];    //线性表的存储空间
    int n;    //线性表的长度
}sqlist;    //线性表类型

顺序表算法

常用操作:插入、删除、查找、排序

插入算法

算法功能:在线性表的第i出插入新元素x

算法思想:

(1)入口判断

​ 存储容量够吗?(n<MAXSIZE)

​ 插入位置正确吗?(i>=1&&i<=n+1)

if(L.n==MAXSIZE) error("溢出");
if(i<1||i>L.n+1) error("插入位置错");

(2)元素ai-an后移 (注意移动次序,应该从后往前移动

for(j=n;j>=i;j--)
{
    L.a[j+1]=l.a[j];
}

(3)在线性表的第i出插入新元素x

L.a[i]=x;

(4)表长加1

L.n++;

算法设计

#define MAXSIZE 100
typedef struct
{
    ElemType a[MAXSIZE+1];    //线性表的容量
    int n;    //线性表的表长
}sqlist;

void sq_ins(sqlist &L,int i,ElemType x)    //线性表L的第i出插入新元素x
{
    int j;
    if(L.n==MAXSIZE) error("溢出");
    else if(i<1||i>L.n+1) error("插入位置错");
    else
    {
        for(j=L.n;j>=i;j--)
        {
            L.a[j+1]=L.a[j];    //元素后移
        }
        L.a[i]=x;    //在i处插入元素x
        L.n++;    //表长加1
    }
}

删除算法

算法功能:删除线性表中的第i个元素,并用x返回其值。

算法思想:

(1)入口判断

​ 线性表时空的吗?删除位置正确吗?

if(i<1||i>L.n) error("删除位置错");
else if(L.n==0) error("表空");

(2)将第i个元素的值放进x(有时可以省略)

x=L.a[i];

(3)元素ai+1-an前移(注意次序)

for(int j=i+1;j<=L.n;j++)
{
    L.a[j-1]=L.a[j];
}

(4)表长-1

L.n--;

算法设计

#define MAXSIZE 100
typedef struct
{
    ElemType a[MAXSIZE+1];    //线性表的容量
    int n;    //线性表的表长
}sqlist;

void sq_del(sqlist &L,int i,ElemType x)    //删除线性表L中的第i个元素
{
    if(i<1||i>L.n) error("删除位置错");
    else if(L.n==0) error("表空");
    else 
    {
        for(int j=i+1;j<=L.n;j++)
        {
            L.a[j-1]=L.a[j];    //元素前移
        }
        L.n--;    //表长-1
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务