数据结构之线性表——顺序表(学习笔记)
顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。【引用自百度百科】顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L> 1≤i≤n 其中,L是元素占用存储单元的长度。
基本操作
1.顺序表插入
在第i(0<i<n+1)个元素之前插入一个元素时,需要将第n至第(n-i+1)个元素往后移动一个位置。详细往下看代码
2.顺序表删除
删除第i(0<i<n+1)个元素时,需要将第i+1至第(n-i)个元素依次向前移动一个位置。详细往下看代码
示例代码
#include <stdio.h>
#include <stdlib.h>
#define TYPE int
#define INC 16//线性表存储空间的分配增量
#define SIZE 100//线性表存储空间的初始分配量
typedef struct{
TYPE *elem;//存储空间首地址
int size;//当前长度
int length;//当前分配的存储容量
}Linelist;
//初始化顺序表
void init(Linelist *L){
L->elem=(TYPE*)malloc(sizeof(TYPE)*SIZE);
if(!L->elem)
printf("ERROR");//存储分配失败
L->size=SIZE;//初始存储容量
L->length=0;//初始长度为0
}
//建立顺序表
void creat(Linelist *L){
int n;//表中元素个数
printf("输入线性表长度:");
scanf("%d\n",&n);
for(int i=0;i<n;i++){
scanf("%d",L->elem+i);
L->length++;
}
}
//插入元素
void inserLinelist(Linelist *L,int i,TYPE value){//i为插入位置,value为要插入数据
if(i>L->size||i<0)//如若要插入位置大于当前顺序表大小或小于0,则报错
printf("ERROR");
if(L->length>=L->size){//如若开辟空间用完则再进行追加开辟空间
L->elem=(TYPE*)realloc(L->elem,sizeof(TYPE)*(L->size+INC));
L->size=SIZE+INC;
}
TYPE *p=L->elem+(i-1);//p为要插入位置
TYPE *q=L->elem+(L->length-1);//顺序表最后元素位置
for(;q>=p;--q)//将要插入位置之后的元素依次往后移位
*(q+1)=*q;
*p=value;
(L->length)++;//长度+1
}
//删除元素
void del(Linelist *L,int i)//i为要删除元素位置
{
if(i>L->size||i<0)
printf("ERROR");
TYPE *p=&L->elem[i-1];//找出删除位置
TYPE *q=&L->elem[L->length-1];//找到顺序表末尾位置
for(;q>p;p++)//将要删除位置之后元素依次往前移动
*p=*(p+1);
L->length--;
}
//打印顺序表
void listprintf(Linelist *L){
printf("输出:");
for(int i=0;i<L->length;i++){
printf("%d ",L->elem[i]);
}
printf("\n");
printf("长度:%d\n",L->length);
}
int main(){
Linelist L;
init(&L);
creat(&L);
listprintf(&L);
printf("在第4位插入元素100\n");
inserLinelist(&L,4,100);
listprintf(&L);
printf("删除第3位元素\n");
del(&L,3);
listprintf(&L);
return 0;
}
结果
输入线性表长度:5
1 2 3 4 5
输出:1 2 3 4 5
长度:5
在第4位插入元素100
输出:1 2 3 100 4 5
长度:6
删除第3位元素
输出:1 2 100 4 5
长度:5