顺序结构
定义: 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
原理: 顺序表存储是将数据元素放到一块连续的内存存储空间,存取效率高,速度快。但是不可以动态增加长度。
优点: 存取速度高效,通过下标来直接存储
缺点: 1.插入和删除比较慢(运算时间代价O(n)) 2.不可以增长长度
比如:插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序。在顺序表中,插入一个元素平均移动的次数是
n
2
\frac{n}{2}
2n次,删除一个元素平均移动此时是
n
−
1
2
\frac{n-1}{2}
2n−1次
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 5 //初始内存大小
#define LIST_INCREASE_SIZE 5 //内存增量
typedef int seqType; //表中存放数据类型
typedef int Status; //返回的操作状态
typedef struct //表结构
{
seqType* ele; //顺序表首元素地址
int length; //表长度
int size; //表大小
}SqList;
//创建表
SqList CreateList(){
SqList* List= (SqList*)malloc(sizeof(SqList));
return *List;
}
//初始化表
Status InitList(SqList &List){
List.ele=(seqType*)malloc(sizeof(seqType)*LIST_INIT_SIZE);
if(!List.ele){
printf("由于内存不足分配失败。\n");
return -1;
}
//数据长度为空
List.length=0;
//表大小为初始大小
List.size=LIST_INIT_SIZE;
return 1;
}
//插入元素
Status Insert(SqList &List,int index, seqType m){
//插入元素的位置大于表的长度
if(index>List.length){
printf("插入位置大于表长度。\n");
return -1;
}
//插入位置为负数则插入到表最后位置
if(index<0){
index=List.length;
}
//表长度等于表大小则表存储空间已满,需要追加内存。
if(List.length==List.size){
printf("表存储空间已满,分配新的内存空间。\n");
seqType* extra=(seqType*)realloc(List.ele, sizeof(seqType)*List.size+LIST_INCREASE_SIZE);
if(!extra){
printf("分配新的内存失败。\n");
return -1;
}
List.ele=extra;
//更新表大小
List.size+=LIST_INCREASE_SIZE;
}
//插入核心操作:将插入点后的元素向后移动一个单位
for (int i = List.length; i>index; i--)
{
List.ele[i]=List.ele[i-1];
}
//插入
List.ele[index]=m;
//更新数据长度
List.length++;
return 1;
}
//删除元素
Status Delete(SqList &List,int index){
//因为这里index表示删除的下标而不是物理位置,故-1
if(index>List.size-1){
printf("删除位置超出数据长度。\n");
return -1;
}
//删除下标小于0则删除最后一个元素
if(index<0){
index=List.size-1;
}
//删除核心操作,元素前移
for (int i = index; List.length-1>i ; i++)
{
List.ele[i]=List.ele[i+1];
}
//更新数据长度
List.length--;
return 1;
}
//销毁表
int Destory(SqList &List){
//释放内存
free(List.ele);
//更新数据长度和表长度
List.length=0;
List.size=0;
}
int main(int argc, char const *argv[])
{
SqList List=CreateList();
InitList(List);
Insert(List,-1,1);
Insert(List,-1,2);
Insert(List,-1,3);
Insert(List,-1,9);
Insert(List,-1,5);
Delete(List,2);
for (int i = 0; i < List.length; i++)
{
printf("ele[%d]:%d\n",i,List.ele[i]);
}
printf("数据长度:%d\n",List.length);
printf("表大小:%d\n",List.size);
//Destory(List);
return 0;
}