数据结构之顺序表

顺序表

一、顺序表的概念

顺序表是一种线性的数据结构,其中数据元素按照特定的顺序依次存储在连续的内存空间中。它由一系列元素组成,每个元素都与唯一的索引(或者叫下标)相关联,索引从0开始递增。

二、顺序表的元素插入

void insert(SequentialList *list, int index, eleType element){
    if(index < 0 || index > list->capacity){
        throw std::invalid_argument("Invalid index");
    }
    if(list->size == list->capacity){
        int newCapacity = list->capacity * 2;
        eleType *newElements = new eleType[newCapacity];
        for(int i = 0; i <= list->size; ++i){
            newElements[i] = list->elements[i];
        }
        delete[] list->elements;
        list->elements = newElements;
        list->capacity = newCapacity;SequentialList *list;
    }
    for(int i = list->size; i > index; --i){
        list->elements[i] = list->elements[i - 1];
    }
    list->elements[index] = element;
    list->size ++;
}

三、顺序表的元素删除

void deleteElement(SequentialList *list, int index){
    if(index < 0 || index >=list->size){
        throw std::invalid_argument("Invalid index");
    }
    for(int i = index; i < list->size - 1; ++i){
        list->elements[i] = list->elements[i + 1];
    }
    list->size --;
}

四、顺序表的元素查找

int findElement(SequentialList *list, eleType element){
    for(int i = 0; i < list->size; ++i){
        if(list->elements[i] == element){
            return i;
        }
    }
    return -1;
}

若顺序表中有被查找的元素则返回下标,无则返回-1

五、顺序表的元素索引

eleType getElement(SequentialList *list, int index){
    if(index < 0 || index >= list->size){
        throw std::invalid_argument("Invalid index");
    }
    return list->elements[index];
}

得到给出索引在顺序表中的对应元素

六、顺序表的元素修改

void updateElement(SequentialList *list, int index, eleType value){
    if(index < 0 || index >= list->size){
        throw std::invalid_argument("Invalid index");
    }
    list->elements[index] = value;
}

七、顺序表底层模板实现

#include<iostream>
​
using namespace std;
​
#define eleType int //根据数据类型的不同int可换成char、double等
​
struct SequentialList{
    eleType *elements;
    int size;
    int capacity;   //实际容量 size <= capacity
};
​
void initializeList(SequentialList *list, int capacity){
    list->elements = new eleType[capacity];
    list->size = 0;
    list->capacity = capacity;
}
​
void destoryList(SequentialList *list){
    delete [] list->elements;
}
​
int size(SequentialList *list){
    return list->size;
}
​
bool isEmpty(SequentialList *list){
    return list->size == 0;
}
​
void insert(SequentialList *list, int index, eleType element){
    if(index < 0 || index > list->capacity){
        throw std::invalid_argument("Invalid index");
    }
    if(list->size == list->capacity){
        int newCapacity = list->capacity * 2;
        eleType *newElements = new eleType[newCapacity];
        for(int i = 0; i <= list->size; ++i){
            newElements[i] = list->elements[i];
        }
        delete[] list->elements;
        list->elements = newElements;
        list->capacity = newCapacity;SequentialList *list;
    }
    for(int i = list->size; i > index; --i){
        list->elements[i] = list->elements[i - 1];
    }
    list->elements[index] = element;
    list->size ++;
}
​
void deleteElement(SequentialList *list, int index){
    if(index < 0 || index >=list->size){
        throw std::invalid_argument("Invalid index");
    }
    for(int i = index; i < list->size - 1; ++i){
        list->elements[i] = list->elements[i + 1];
    }
    list->size --;
}
​
int findElement(SequentialList *list, eleType element){
    for(int i = 0; i < list->size; ++i){
        if(list->elements[i] == element){
            return i;
        }
    }
    return -1;
}
​
eleType getElement(SequentialList *list, int index){
    if(index < 0 || index >= list->size){
        throw std::invalid_argument("Invalid index");
    }
    return list->elements[index];
}
​
void updateElement(SequentialList *list, int index, eleType value){
    if(index < 0 || index >= list->size){
        throw std::invalid_argument("Invalid index");
    }
    list->elements[index] = value;
}
​
int main(){
    SequentialList myList;
    initializeList(&myList, 10);
    for(int i = 0; i < 10; i++){
        insert(&myList, i, i * 10);
    }
    cout << "Size:" << size(&myList) << endl;       //Size:10
    cout << "Is empty:" << isEmpty(&myList) << endl;        //Is empty:0
​
    for(int i = 0; i < size(&myList); i++){
        cout << getElement(&myList, i) << " ";
    }       //0 10 20 30 40 50 60 70 80 90
    cout << endl;
    deleteElement(&myList, 5);
    updateElement(&myList, 1, 1314);
    for(int i = 0; i < size(&myList); i++){
        cout << getElement(&myList, i) << " ";
    }       //0 1314 20 30 40 60 70 80 90
    cout << endl;
​
    int index = findElement(&myList, 20);
    updateElement(&myList, index, 520);
    for(int i = 0; i < size(&myList); i++){
        cout << getElement(&myList, i) << " ";
    }       //0 1314 520 30 40 60 70 80 90
    cout << endl;
​
    destoryList(&myList);
​
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值