数据结构与算法----顺序表

在介绍顺序表之前,先要说明一下线性表

所谓线性表,是一种可以更加方便的存储数据以及使用数据的工具

传统的数组没有办法十分灵活的实现各种功能

所以引入了线性表的概念

线性表的基本操作

  • 初始化线性表:将一个线性表进行初始化,得到一个全新的线性表。

  • 获取指定位置上的元素:直接获取线性表指定位置i上的元素。

  • 获取元素的位置:获取某个元素在线性表上的位置i

  • 插入元素:在指定位置i上插入一个元素。

  • 删除元素:删除指定位置i上的一个元素。

  • 获取长度:返回线性表的长度。

顺序表说明

所谓顺序表就是底层仍使用数组来实现线性表的操作,核心还是数组

接下来一一介绍如何实现线性表的功能

1.初始化

我们将之后可能用到的数据汇总到一个结构体中

struct ArrList{
    int *arr;
    int capacity;
    int size;
};

为什么要采用数组指针的形式:因为如果使用一般形式来定义数组的话,那么容量将会变得固定

而使用数组指针将会更加方便扩容

void InitList(struct List* Arr , int space){
    Arr->arr = (int*)malloc(sizeof(int)*space);
    if(Arr->arr == NULL) return 0;
    Arr->capacity = space;
    Arr->size = 0;
}

注意在使用malloc分配内存的时候,要注意是否内存分配成功,如果不成功那么直接结束

注意size也应该初始化为0;

2.插入元素

数据结构与算法----顺序表_第1张图片

相当于原本index以及index之后的元素分别向后移动一个小格,以此来实现插入的操作;

注意

1.因为是插入操作,所以可能会出现数组越界的操作,所以我们要扩大这一片内存

2.注意插入的下标是有范围的,如果小于0那么就直接结束,大于最大值就默认为最大值

void InsertList(struct ArrLisr* Arr , int elememt , int index){
    if(index < 0) return 0;
    if(index > Arr->size)
        index = Arr->size;
    if(Arr->size == Arr->capacity){
        int Newcapacity = Arr->capacity + 15;
        int* NewArr = (int*)realloc(Arr->arr , sizeof(int)*New->capacity);
        if(NewArr == NULL) return 0;
        Arr->capacity = newcapacity;
        Arr->arr = NewArr;
    }
    for(int temp = Arr->size - 1 ; temp <= index ; temp --){
        Arr->arr[temp + 1] = Arr->arr[temp];
    }
    Arr->arr[index] = element;
    Arr->size++;
}

3.删除元素

数据结构与算法----顺序表_第2张图片

 

删除元素其实是对元素的覆盖,

即将要删除的元素用身后的元素覆盖,以此类推达到删除的效果,同时通过控制size来控制不会访问出错

值得注意的是,如果下标越界,那么直接返回

void DeleteList(struct ArrList* Arr , int index){
    if(index < 0 || index >= Arr->size) return 0;
    for(int temp = index + 1 ; temp < Arr->size ; temp++)
        Arr->arr[temp - 1] = Arr->arr[temp];
    Arr->size--;
}

核心的操作便是以上三种,其他便是一些附属功能

打印顺序表

void PrintList(struct ArrList*Arr){
    for(int temp = 0 ; temp < Arr->size ; temp++)
        printf("%5d",Arr->arr[temp]);
    printf("\n");
}

查找元素下标

int SearchElem(struct ArrList* Arr , int elememt){
    int index = 0;
    int flag = 0;
    while(index < Arr->size){
        if(Arr->arr[index] == elememt){
            flag = 1;
            break;
        }
        index++;
    }
    if(flag)
        return index;
    else
        return -1;
}

查找下标元素

int Searchindex(struct ArrList * Arr , int index){
    if(index < 0 || index >= Arr->size) return 0;
    int elememt = Arr->arr[index];
    return elememt;
}

顺序表长度

int LenList(struct ArrList* Arr){
    return Arr->size;
}

你可能感兴趣的:(算法,数据结构)