顺序表
一、顺序表的概念
顺序表是一种线性的数据结构,其中数据元素按照特定的顺序依次存储在连续的内存空间中。它由一系列元素组成,每个元素都与唯一的索引(或者叫下标)相关联,索引从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; }