王道数据结构-课上代码实现-线性表的操作-0基础版(一)顺序表

针对王道课上视频讲解,自己整理的知识

0x01 C语言预备知识

1、结构体:
一种数据类型,由一批数据组合而成的结构型数据,可以类比为:一个人(数据类型)有多个属性(变量),比如身高、体重、身份证号、性别。。。我们可以把人称为一个结构体。

struct people{
    int height;
    int weight;
    char gender;
    ......
};

这样,我们在声明一个叫“人”的变量的时候,可以写作:

struct people xiaoming;

通过"."可以获取相应的属性值:

xiaoming.height=180;
xiaoming.weight=70;

2、typedef关键字:
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。

typedef int ElemType;//表示将int重命名为ElemType
//也可以作用在结构体:
typedef struct {
    ElemType data[MaxSize];
    ElemType length;
}SqList;//可以写成typedef struct {.....} SqList;表示将结构体struct SqList重命名为SqList

3、结构体指针:
表示一个【可以】指向结构体类型的指针
【可以】:指向一个结构体类型的指针,要求指向的数据类型必须为结构体。
例如:

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
//这里的LinkList表示一个结构体指针,指向一个结构体LNode的头部。
//结构体指针也可以表示出结构体内部的数据,例如:
LinkList L;
L->data//表示L指向的结构体的data属性的值。
L->next//表示L指向结构体内部的【指向结构体的指针“next”】

0x02 静态分配存储空间的顺序表(数组)

#define MaxSize 10

typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    ElemType length;
}SqList;

一、初始化一个顺序表:
1、参数中传入一个结构体L
2、通过循环,将该顺序表数据全清空为0,以便于后期进行操作
3、设置length长度为0,初始化完成。

void InitList(SqList &L){
    for(int i=0;i<MaxSize;i++)
        L.data[i]=0;
        // L.data[i]=0;内存中含有脏数据
    L.length=0;
}

二、顺序表插入操作:
对于给定的线性表L,需要将数组第i个位置之后插入元素为e:
1、判断传入的参数是否合法:位置是否正确、是否overflow
2、定义一个参数j,将j定位到要插入的位置之一个位置将该位置之后的元素全部右移。
3、将该元素插入到其中。

bool ListInsert(SqList &L,int i,int 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];//插入元素,
    }
    L.data[i-1]=e;
    L.length++;
    return true; 
}

三、顺序表删除操作:
将给定的线性表L,删除第i个元素,将被删除的元素保存在DeleElem变量中:
1、判断传入参数是否合法:查看i所在位置是否合法。
2、定义一个变量j,将j定位到位置i上,把j的下一个元素=第j个元素(用后面的数据将前面的数据覆盖,达到另一种意义上的删除),实现删除。
3、将线性表的length–。

bool ListDelete(SqList &L,int i,int &DeleElem){
    if(i<0||i>L.length-1){
        return false;
    }
    DeleElem=L.data[i-1];
    for (int j = i; j <=L.length-1; j++){
        L.data[j-1]=L.data[j];//删除元素,在第i个位置删除,后面的元素就应该跑到前面去。
    }
    L.length--;
    return true;
}

四、顺序表的查找操作:
按位查找:
由于是数组,可以直接返回位置对应的元素。

ElemType GetElem(SqList &L,int loc){//按位查找
    return L.data[loc-1];
}

按值查找:
一个for循环,直接可以得出元素e对应的位置。

int LocateElem(SqList &L,ElemType e){//按值查找
    for (int i = 0; i < L.length; i++)
        if(L.data[i]==e)
            return i+1;//返回该值索引(i)的位置(i+1) 
}

0x03 动态分配存储空间的顺序表

由于静态顺序表不能够拓展空间,空间大小只能由MaxSize决定

#define InitSize 10  //顺序表初始长度

typedef int ElemType;
typedef struct{
    int *data;//指动态分配数组的指针,指向顺序表第一个元素
    int MaxSize;//顺序表最大容量,当前分配的存储空间的大小,若不足,可再进行分配
    int length;//顺序表当前长度
}SqList;

初始化:
对于传入的L:
malloc函数可以开辟一段给定大小的空间,这里我们定义要开辟的空间大小为:sizeof(ElemType)*InitSize
sizeof()函数可以返回一个数据类型的大小,×InitSize(长度)就可以开辟出指定大小的区域。

void InitList(SqList &L){
    L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize);//返回新开辟的地址
    L.length=0;
    L.MaxSize=InitSize;
}

动态增加顺序表的长度:
1、定义一个int类型的p指针,指向L的第一个元素
2、令L的data指针指向一段开辟的新空间,与初始化同理,扩充的容量大小为(L.MaxSize+len)*sizeof(ElemType)
3、将原有的数据全部复制进去。
4、最大长度更改为新的长度。

void IncreaseSize(SqList &L,int len){//增加动态数组长度
    int *p=L.data;
    L.data=(ElemType *)malloc(sizeof(ElemType)*(L.MaxSize+len));//扩充容量大小
    for (int i = 0; i < L.length; i++){
        L.data[i]=p[i];//数据复制到新区域
    }
    L.MaxSize=L.MaxSize+len;//最大长度改变
    free(p);
}

未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值