线性表的顺序存储结构:
一段地址连续的存储单元依次存储线性表的数据元素,可以用一维数组来实现顺序存储结构,线性表不能超过存储容量(数组的长度);
顺序表的描述三属性:
1、存储空间的起始位置
2、表的最大存储容量(数组的长度)
3、线性表的当前长度
应当遵循的是:当前长度 < = 存储容量
顺序表结构的操作(插入、删除、查阅)
插入操作从表尾开始到要插入的位置(包括),节点往后移动,最后记得表长度加1
void charu(int n,int data)
{
int j;
if(n<1 || (n>sp.listw+1) || (sp.listw>=sp.listmax))//当插入的位置比1小 或 插入的位置远远超过表尾 或 表尾已经是表的最大值时
{
printf("非法!\n");
return;
}
else if((n==sp.listw+1) && (sp.listw<sp.listmax))//当插入的位置是表尾且表尾小于表的最大值时
{
sp.num[n-1]=data;//将数据写到表尾
sp.listw++;//表尾加一
return;
}
else//当插入的位置不是表尾且不是非法的位置时
{
for(j=sp.listw-1;j>=n-1;j--)//将人数数的习惯变为数组的下标,从表尾开始
{
sp.num[j+1]=sp.num[j];//往后移动
}
sp.num[n-1]=data;
sp.listw++;
}
}
删除的操作则是从要删除的位置往后一个节点开始到表尾(包括),往前移动,最后表尾减1
void shanchu(int n)
{
int j;
if((n<1) || (n>sp.listw))//删除的位置比1小或者大于表尾时
{
printf("非法!\n");
return;
}
else if(n==sp.listw)//当删除的位置是表尾
{
sp.num[n-1]=0;
sp.listw--;
return;
}
else//当删除的位置不是表尾且不是非法的位置时
{
for(j=n;j<=sp.listw-1;j++)//将人数数的习惯变为数组的下标,从删除的位置下一个开始
{
sp.num[j-1]=sp.num[j];
}
sp.listw--;
}
}
查阅
int chayue(int n)
{
int m;
if((n<1) || (n>sp.listw))
{
printf("非法!\n");
return;
}
else
{
m=sp.num[n-1];
return m;
}
}
总和
#include<stdio.h>
typedef struct studen
{
int num[10];
int listw;//表尾长度
int listmax;//表的空间最大值
}splist;
splist sp;
void xianshi()
{
int i;
for(i=0;i<sp.listw;i++)
{printf("%d ",sp.num[i]);}
putchar('\n');
printf("********************************************\n");
}
void write()
{
int i;
for(i=0;i<5;i++)
{
sp.num[i]=i;
}
sp.listw=i;
sp.listmax=10;
return;
}
void charu(int n,int data)
{
int j;
if(n<1 || (n>sp.listw+1) || (sp.listw>=sp.listmax))//当插入的位置比1小 或 插入的位置远远超过表尾 或 表尾已经是表的最大值时
{
printf("非法!\n");
return;
}
else if((n==sp.listw+1) && (sp.listw<sp.listmax))//当插入的位置是表尾且表尾小于表的最大值时
{
sp.num[n-1]=data;//将数据写到表尾
sp.listw++;//表尾加一
return;
}
else//当插入的位置不是表尾且不是非法的位置时
{
for(j=sp.listw-1;j>=n-1;j--)//将人数数的习惯变为数组的下标,从表尾开始
{
sp.num[j+1]=sp.num[j];//往后移动
}
sp.num[n-1]=data;
sp.listw++;
}
}
void shanchu(int n)
{
int j;
if((n<1) || (n>sp.listw))//删除的位置比1小或者大于表尾时
{
printf("非法!\n");
return;
}
else if(n==sp.listw)//当删除的位置是表尾
{
sp.num[n-1]=0;
sp.listw--;
return;
}
else//当删除的位置不是表尾且不是非法的位置时
{
for(j=n;j<=sp.listw-1;j++)//将人数数的习惯变为数组的下标,从删除的位置下一个开始
{
sp.num[j-1]=sp.num[j];
}
sp.listw--;
}
}
int chayue(int n)
{
int m;
if((n<1) || (n>sp.listw))
{
printf("非法!\n");
return;
}
else
{
m=sp.num[n-1];
return m;
}
}
void main()
{
int cha_yue;
printf("建立的顺序表为:");
write();
xianshi();
printf("插入第二后的顺序表为:");
charu(2,99);//在第二个位置插入99
xianshi();
printf("删除第二后的顺序表为:");
shanchu(2);//删除位置为2
xianshi();
printf("查阅第二的数据为:");
cha_yue=chayue(2);
printf("%d\n",cha_yue);
}