顺序表的创建
对于不少初学数据结构的人来说,理解数据的处理和存储方式还是比较简单的,但是真正的问题在于数据结构中对数据处理的诸多函数的实现上,所以我在此将数据结构中重要的又是基础的各种表和图的创建和运算的函数总结出来,以供初学者使用。
今天讲得是顺序表,所谓的顺序表其实就是线性表依据存储结构的不同而命名的。线性表依据存储结构的不同可以分为线性表和链表。线性表是指其物理存储结构和逻辑存储结构是一致的,即逻辑相邻在物理存储上也是相邻的。(链表下章在讲)线性表的优点是占用最少的存储空间,因为不需要存储各个数据元素之间的关系。其缺点是插入和删除时要移动后面大量元素。
顺序表是用c中的数组来实现的。
注意:以下程序是在vc 6.0上实现的;如果进行相应的程序实现请自行加入iostream.h和stdlib.h等头文件。
顺序表结构的定义
#define MAXNUM 100
typedef int DataType; //DataType可以代指多种数据类型,如char,int,float等
typedef struct
{
DataType data[MAXNUM];
int last;
}SepList;
置空表
void SepLSetNull(SepList *l)
{
l->last=-1;
cout<<"链表已置空"<<endl;
}
求顺序表的长度
int SepLLength(SepList *l)
{
return l->last+1;
}
取结点,即取出第i个位置的结点值
DataType SepLGet(SepList *l,int i)
{
if(i<1||i>l->last+1)
{cout<<"i的位置不正确"<<endl;
return ERROR;
}
return l->data[i-1];
}
定位一个结点,即确定值x在顺序表中的位置
int SepLLocate(SepList *l,int x)
{
int i; //计数器
for(i=0;i=l->last;i++)
if(l->data[i]==x) return(i+1);
return 0;
}
插入结点,即在第i处插入值x
int SepLInsert(SepList *l,int i,int x)
{
int j; //计数器
if(l->last>=MAXNUM-1)
{
cout<<"数据溢出"<<endl;
return 0;
}
if(i<1||i>l->last+2)
{
cout<<"插入位置不正确"<<endl;
return 0;
}
else
{
for(j=l->last;j>=i-1;j--)
l->data[j+1]=l->data[j];
l->data[i-1]=x;
l->last++;
}
return OK;
}
删除第i处的结点
int SepLDelete(SepList *l,int i)
{
int j;
if(i<1||i>l->last+1)
{
cout<<"删除位置不正确"<<endl;
return 0;
}
else
{
for(j=i;j<=l->last;j++)
l->data[j-1]=l->data[j];
l->last--;
}
return OK;
}
创建顺序表
void SepLCreate(SepList *l)
{
int i,n;
cout<<"请输入表的长度"<<endl;
cin>>n;
l->last=n-1;
cout<<"依次输入表中的数据元素:"<<endl;
for(i=0;i<n;i++)
{
cout<<"第"<<i+1<<"个元素是:";
cin>>l->data[i];
}
}
输出顺序表
void SepLPrint(SepList *l)
{
int j;
if (l->last<0)
{cout<<"此为空表"<<endl;
exit(0);
}
else
{ cout<<"表中数据如下"<<endl;
for(j=0;j<=l->last;j++)
cout<<l->data[j]<<"\t";
cout<<endl;}
}
以上是关于顺序表的基本运算的一些相关函数(不包含主函数)。如果初学者想要进行函数的实现测试可以自行添加main函数,只需调用以上操作函数即可。
下一篇,链表的创建和相关运算