文章预览:

  • 数据结构与算法基础-王卓
  • 第一章绪论
  • **1.1.1基本概念和术语**
  • 数据
  • 数据元素
  • 数据项
  • 数据对象
  • 1.1.2基本概念和术语
  • 1.数据结构解释
  • 2.数据结构包括三方面内容
  • 3.数据结构的两个层次
  • 1.1.3数据类型和抽象数据类型
  • 第二章 线性表
  • 2.1类c语言有关操作补充1
  • 2.1.1补充:元素类型说明
  • 2.1.2补充:数组定义
  • 2.1.3 C语言的内存动态分配
  • 2.1.4补充:C++的动态存储分配(相比C的动态分配更简单)
  • 2.2类C语言有关操作补充2
  • 2.1.1 C++的参数传递
  • 2.3线性表基本操作的实现
  • 2.3.1线性表的基本操作
  • 2.3.2顺序表基本操作的实现


数据结构与算法基础-王卓

第一章绪论

1.1.1基本概念和术语

数据
  • 是能输入计算机且能被计算机处理的各种符号的集合
数据元素
  • 数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
  • 如下表格则为数据,第二行则为数据元素
  • 也称为元素、记录、结点、或顶点

班级

姓名

年龄

23.1

张三

21

20.7

王五

20

19.7

李四

22

数据项
  • 构成数据元素的不可分割的最小单位,表格中的张三即数据项
数据对象
  • 性质相同的数据元素的集合,是数据的一个子集
    例如:
  • 整数数据对象是集合N={0,+1,-1,+2,-2,…}
  • 学籍表也可看作一个数据对象,性质相同的数据元素即可看作为数据对象

1.1.2基本概念和术语

1.数据结构解释
  • 数据元素相互之间的关系称为结构
  • 是指相互之间存在一种或多种特定关系的数据元素集合
2.数据结构包括三方面内容
  • 数据元素之间的逻辑关系,也称为逻辑结构
  • 数据元素及其关系在计算机内存中的表示,称为数据的存储结构
  • 数据的运算和实现
3.数据结构的两个层次
  • 逻辑结构
  • 存储结构
    3.1逻辑结构与存储结构的关系:
  • 存储结构是逻辑关系的映像与元素本身的映像
  • 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
  • 两者综合起来,建立了数据元素之间的结构关系

3.1.1逻辑结构

(1)线性结构

一个前驱,一个后继

(2)非线性结构

一对多

3.1.2四种存储结构

  • 顺序存储结构
  • 链式存储结构
  • 索引存储结构(了解)
  • 散列存储结构(了解)

1.1.3数据类型和抽象数据类型

概念小结:

数据结构与算法的视频 《数据结构与算法》_数据结构与算法的视频

第二章 线性表

2.1类c语言有关操作补充1

2.1.1补充:元素类型说明

顺序表类型定义:

typedef struct{

ElemType data[];

int length;

}SqList;//顺序表类型

说明:ElemType 在这里代表元素类型的意思,无实际意义,当实际情况中知道类型,就可加上 下面的代码:

typedef char ElemType;//假如已知元素类型为char型

如果表中元素类型不单一,则可用以下方式(即把上述代码拆分为两块:

typedef struct{

float p;

int e;

}Polynomial;

typedef struct{

Polynomial *elem;//首地址,elem保存地址

int length;

}SqList;
2.1.2补充:数组定义
  • 定义方式一:数组静态分配
typedef struct{ 
    ElemType data[MaxSize]; 
    int length;
}SqList;//顺序表类型
  • 定义方式二:数组动态分配(上述元素有多个类型,即使用的是动态分配方式定义数组的)
typedef struct{
    ElemType *data;//数组首地址
    int length;
}SqList;//顺序表类型

这种方式我们不知道内存到底有多大,接下来将用内存分配函数来分配空间:

SqList L;//L就是要操作的顺序表,即SqList
L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);
2.1.3 C语言的内存动态分配
  • malloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址
  • sizeof(x)运算,计算变量x的长度,即变量需占的字节数*变量个数
  • L.data是数组的首地址(无空间),ElemType*使新分配的空间首地址的元素类型为数组的元素类型,
    一个“=”就能将放置数组元素类型的空间分配给L了
  • free§函数,释放指针p所指变量的存储空间,即彻底删除一个变量
2.1.4补充:C++的动态存储分配(相比C的动态分配更简单)

new 类型名T(初值列表)

功能:

申请用于存放T类型对象的内存空间,并依初值列表赋以初值

结果值:

成功:T类型的指针,指向新分配的内存

成功:0(NULL)

int *p1 = new int;//或 int *p1 = new int(10)

delete 指针P

功能:

释放指针P所指向的内存。P必须是new操作的返回值

2.2类C语言有关操作补充2

2.1.1 C++的参数传递
  • 传值方式(参数为整型、实型、字符型等)
#include<iostream.h>
void swap(float m,float n)
{
    float temp;
    temp = m;
    m = n;
    n = temp;
}
void main()
{
    float a,b;
    cin>>a>>b;
    swap(a,b);
    cout<<a<<endl<<b<<endl;
}

说明:函数修改的是形参的值,释放空间后,形参释放,实参的值不变

  • 传地址
  • 参数为指针变量
  • 形参变化影响实参
#include<iostream.h>
void swap(float *m,float *n)
{
    float t;
    t = *m;
    *m = *n;
    *n = t;指交换m和n所指的内容
}
void main()
{
    float a,b,*p1,*p2;
    cin>>a>>b;
    p1 = &a;p2 = &b;//p1、p2分别指向变量a、b
    swap(p1,p2);
    cout<<a<<endl<<b<<e
  • 形参变化不影响实参
#include<iostream.h>
void swap(float *m,float *n){
    float *t;
    t = m;
    m = n;
    n = t;//交换的是m和n指向的地址不是地址中的内容
}
void main()
{
    float a,b,*p1,*p2;
    cin>>a>>b;
    p1 = &a;p2 = &b;
    swap(p1,p2);
    cout<<a<<endl<<b<<e
  • 参数为引用变量(引用,即给一个对象提供一个替代的名字)
#include<iostream.h>
void main(){
int i = 5;
int &j = i;
i = 7;//公用同一个空间,但是同时有i、j两个名字,因此改变一个值时,另一个值也会改变
cout<<"i = "<<i<<"j"<<j;
}
  • 参数为数组名(传递的是数组的首地址,对形参数组所做的任何改变都将反映到实参数组中)
#include<iostream.h>
void sub(char b[]){
        b[] = "world";
}
void main(void){
    char a[10] = "hello";
    sub(a);
    cout<<a<<endl;
}

2.3线性表基本操作的实现

2.3.1线性表的基本操作
  • 线性表的基本操作
  • InitList(&L)
  • DestroyList(&L)
  • ClearList(&L)
  • ListInsert(&L,i,e)
  • ListDelete(&L,i,&e) //删除线性表L中第i个位置元素,用e返回
  • IsEmpty(L)
  • ListLength(L)
  • LocateElem(L,e) //L中查找与给定值e相等的元素,若成功返回该元素在表中的序号,否则返回0
  • GetElem(L,i,&e) //将线性表L中的第i个位置元素返回给e
  • 补充:操作算法中用到的预定义常量和类型
• //函数结果为状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char ElemType;
2.3.2顺序表基本操作的实现
  • 线性表L的初始化(参数用引用)
Status InitList_Sq(SqList &L){
    L.elem = new ElemType[MAXSIZE];
    if(!L.elem) exit(OVERFLOW);
    L.length = 0;
    return 0;
}
  • 顺序表的查找
int LocateElem(SqList L,ElemType e){
    //在线性表中查找值为e的数据元素,返回其序号(是第几个元素)
    for(i = 0;i<L.length;i++)
        if(L.elem[i] = e)
            return i+1;
    return 0;
}
  • 顺序表的插入
    算法的思想:
  1. 判断插入位置i是否合法
  2. 判断顺序表存储空间是否已满,若已满返回ERROR
  3. 将第n至第i位的元素依次向后移动一个位置,空出第i个位置
  4. 将要插入的新元素e放入第i个位置
  5. 表长加1,插入成功返回OK
Status ListInsert_SqList(&L,int i,ElemType e){
    if(i<1||i>L.length+1)return ERROR;// 1 i值不合法
    if(L.length==MAXSIZE)return ERROR;// 2 当前存储空间已满
    for(j=L.length-1;j>=i-1;j--)
        L.elem[j+1]=L.elem[j];// 3 插入位置及以后的元素后移
    L.elem[i-1]=e;// 4 将新元素e放入第i个位置
    L.length++;// 5 表长增1
    return OK;
    
    
}
  • 顺序表的删除
    算法思想:
  1. 判断删除位置i是否合法(合法值为1<=i<=n)
  2. 将欲删除的元素保留在e中
  3. 将第i+1至第n位的元素依次向前移动一个位置
  4. 表长减1,删除成功返回OK
Status ListDelete Sq(SqList &L,int i){
    if((i<1)||(i>L.length)) return ERROR;// 1 i值不合法
    for(j=j;j<=L.length-1;j++)
        L.elem[j-1]=L.elem[j]; // 2 被删除元素之后的元素前移
    L.length--; // 3 表长减1
   return 0;
}