顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。即顺序表的本质可以理解为数组。
1.顺序表的建立以及初始化
#include<stdio.h>
#define MAXSIZE 255//表中元素最大个数
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int length;//表中元素个数
}SeqList;
int Init_List(SeqList *L)
{
L->length = 0;
}
2.顺序表插入元素
插入元素的基本思想就是将待插入元素位置以后的所有元素依次向后移一位,然后将待插元素放入相应的位置,最后元素总个数加一。
int Insert_List(SeqList *L,int l,int x)
{
int i;
if(L->length > MAXSIZE)
{
printf("插入失败,表中元素已满。\n");
return 0;
}
if(l < 0 || l > L->length)
{
printf("插入的位置有误!\n");
return 0;
}
for(i = L->length;i > l;i--)
{
L->data[i] = L->data[i-1];//表中元素
}
L->data[l] = x;
L->length++;
return 1;
}
3.顺序表查找元素
查找的方式有很多,折半查找,哈希查找等等,下面示例用顺序查找方式。
·按位置查找,查找成功则返回该位置的元素值
Elemtype Find_Locaion(SeqList *L,int l)
{
if(l < 0 || l > L->length)
{
printf("插入的位置有误!\n");
return 0;
}
return L->data[l];
}
·按元素值查找,查找成功则返回该元素的位置
int Find_Elem(SeqList *L,int x)
{
int i;
for(i = 0;i < L->length;i++)
{
if(L->data[i] == x)
return i;
}
return -1;
}
4.顺序表删除元素
删除元素的思想与插入元素的思想类似,找到待删除元素的位置,将此元素之后的所有元素依次向前移一位,最后元素总个数减一。
int Del_List(SeqList *L,int x)
{
int l = Find_Elem(L,x);//找到待删元素的位置
for(int i = l+1;i < L->length;i++)
{
L->data[i-1] = L->data[i];//元素依次向前移一位
}
L->length--;
return 1;
}
5.顺序表修改元素
int Modify_List(SeqList *L,int l,int x)
{
if(l < 0 || l > L->length)
{
printf("修改的位置有误!\n");
return 0;
}
L->data[l] = x;
return 1;
}
完整代码实现:
#include<stdio.h>
#define MAXSIZE 255//表中元素最大个数
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int length;//表中元素个数
}SeqList;
int Init_List(SeqList *L);//初始化顺序表
int Insert_List(SeqList *L,int l,int x);//插入元素
Elemtype Find_Locaion(SeqList *L,int l);//按位置查找
int Find_Elem(SeqList *L,int x);//按元素值查找
int Empty_List(SeqList *L);//判断顺序表是否为空
int Length_List(SeqList *L);//求表长
int Del_List(SeqList *L,int x);//删除元素
int Modify_List(SeqList *L,int l,int x);//修改元素
void Print_List(SeqList *L);//遍历顺序表
int Init_List(SeqList *L)
{
L->length = 0;
}
int Insert_List(SeqList *L,int l,int x)
{
int i;
if(L->length > MAXSIZE)
{
printf("插入失败,表中元素已满。\n");
return 0;
}
if(l < 0 || l > L->length)
{
printf("插入的位置有误!\n");
return 0;
}
for(i = L->length;i > l;i--)
{
L->data[i] = L->data[i-1];//表中元素
}
L->data[l] = x;
L->length++;
return 1;
}
Elemtype Find_Locaion(SeqList *L,int l)
{
if(l < 0 || l > L->length)
{
printf("插入的位置有误!\n");
return 0;
}
return L->data[l];
}
int Empty_List(SeqList *L)
{
if(L->length == 0)
return 1;
else
return 0;
}
int Length_List(SeqList *L)
{
return L->length;
}
int Find_Elem(SeqList *L,int x)
{
int i;
for(i = 0;i < L->length;i++)
{
if(L->data[i] == x)
return i;
}
return -1;
}
int Del_List(SeqList *L,int x)
{
int l = Find_Elem(L,x);//找到待删元素的位置
for(int i = l+1;i < L->length;i++)
{
L->data[i-1] = L->data[i];//元素依次向前移一位
}
L->length--;
return 1;
}
int Modify_List(SeqList *L,int l,int x)
{
if(l < 0 || l > L->length)
{
printf("修改的位置有误!\n");
return 0;
}
L->data[l] = x;
return 1;
}
void Print_List(SeqList *L)
{
for(int i = 0;i < L->length;i++)
{
printf("%d\n",L->data[i]);
}
}
int main()
{
SeqList L;
int i;
int k,m;
Init_List(&L);
Insert_List(&L,0,1);
Insert_List(&L,1,2);
Insert_List(&L,2,3);
Insert_List(&L,3,4);
Insert_List(&L,4,5);
k = Empty_List(&L);
m = Length_List(&L);
printf("%d %d\n",k,m);
Print_List(&L);
return 0;
}