一、顺序表的基本概念
概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。
特点:逻辑上相邻的数据元素,物理次序也是相邻的。
只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。
二、线性表的存储位置
每个元素需占用l个存储单元
第i+1个元素的存储位置LOC(ai+1)与第i个元素的存储位置LOC(ai)的关系:
LOC(ai+1)= LOC(ai)+ l
第i个元素的存储位置LOC(ai)与第1个元素的存储位置LOC(a1)的关系:
LOC(ai+1)= LOC(ai)+ (i-1)* l
三、顺序表的实现
#include<stdio.h>
#include<stdlib.h>
#define maxlen 100 //数据最大长度 maxlen
#define ok 1 //操作成功标识 ok
#define no -1 //操作失败标识 no
typedef int Elemtype; //Elemtype是数据的类型
typedef int cz; //cz为执行操作时函数的类型
typedef struct{ //定义顺序表的结构sqlist
int len; //len是表的长度
Elemtype *elem; //elem为表中所存的数据
}Sqlist;
cz Initlist(Sqlist *L) //初始化顺序表
{
L->elem=(Elemtype*)malloc(sizeof(Elemtype)*maxlen); //动态分配表的内存
if(!L->elem){ //判断是否给顺序表L分配了内存单元
return no;
}
L->len=0;
return ok;
}
cz Listinsert(Sqlist *L,int i,Elemtype e) //插入 在第i位插入e元素
{
if(i>L->len+1||i<1){ //判断i是否符合条件
return no;
}
if(i<=L->len) //判断是否是在表尾插入
{
for(int j=L->len-1;j>=i-1;j--){
L->elem[j+1]=L->elem[j]; //i后面的值后移
}
}
L->elem[i-1]=e; //把e值传给i位元素
L->len++; 长度加1
return ok;
}
cz Listdel(Sqlist *L, int i) //删除第i位元素
{
if(L->len==0||i<1||i>L->len){ //判断i是否符合条件且L长度不为1
return no;
}
for(int j=i-1;j<L->len;j++){
L->elem[j] = L->elem[j+1]; //i后面的值左移
}
L->len--; //长度减1
return ok;
}
cz Getelem(Sqlist L, int i, Elemtype *e) //获取第i位元素的值并把其传给e
{
if(i<1||i>L.len){ //判断i是否符合条件且L长度不为1
return no;
}
*e = L.elem[i-1]; //给值
return ok;
}
void Output(Sqlist L) //遍历输出
{
printf("当前顺序表的长度:%d\n", L.len);
for(int i=0;i< L.len;i++){ //遍历整个L
printf("%d ",L.elem[i]);
}
printf("\n");
}
int main()
{
Sqlist *L; //创建一个顺序表
Initlist(L); //把表初始化
int i=1;
int n;
Elemtype e;
printf("请输入数据:");
while(1){
scanf("%d",&n);
if(n== -1) break;
e=(Elemtype)n;
Listinsert(L,i,e);
i++;
}
printf("------------------------以上数据已插入表中-------------------------\n");
printf("\n");
printf("---------------------------遍历表中的数据---------------------------\n");
Output(*L);
printf("---------------------------删除表中的数据---------------------------\n");
printf("请输入欲删除数据的位置:");
scanf("%d",&n);
Listdel(L,n);
Output(*L);
printf("---------------------------获取表中的数据---------------------------\n");
Elemtype x;
printf("请输入欲获取数据的位置:");
scanf("%d",&n);
Getelem(*L,n,&x);
printf("第%d位元素的值为:%d\n",n,x);
return 0;
}