您的位置:首页 > 理论基础 > 数据结构算法

数据结构:顺序表的基本操作

2014-10-16 18:32 260 查看
计算机中线性表的存放结构主要有两种:顺序存储结构和链式存储结构。采用前者存放方式的线性表是顺序表,采用后者的就是我们平时所说的链表(线性链表)。

这里先对顺序表的一些基本操作进行归纳和总结,链表的将在后面的文章中归纳总结。

顺序表的表示,一般都是借助一维数组。C++语言定义其结构如下:

const int  MAXSIZE=100;              /*常量表示线性表可能达到的最大长度*/

typedef struct
{
ElemType elem[MAXSIZE];       /*最大的数组空间*/
int last;                     /*记录表中最后一个元素的下表,空表置为-1*/
}SeqList;                           /*使用数据结构SeqList定义变量*/


下面将依据以上数据结构进行举例说明线性表的一些基本操作。

(一)查找操作

(1)按序号查找GetDate(L,i)

由顺序表的数据结构决定,直接使用L.elem[i-1]就可查找到。

(2)按元素查找Locate(L,e)

算法思想:从第一个元素开始,依次将表中元素与e比较,若相等则查找成功,返回元素序号;

若无元素与e相等,则查找失败。

算法实现:

int Locate(SeqList L,int e)            /*这里暂且使用int作为ElemType代表类型*/
{
    int i=0;                           /*扫面计数器,从第一个开始*/

    while((i<L.last)&&(L.elem[i]!=e))  /*顺序扫表,知道找到e或是扫描结束*/
        i++;

    if(i<=L.last)                      /*找到元素,返回其序号*/
    {
        return i+1;
    }
    else                               /*没有找到元素*/
    {
        return -1;
    }

 }/* Locate*/
(二)插入操作

算法描述:顺序表的存储结构决定了结点的物理顺序必须和其逻辑结点保持一致。

因此必须将原表中的i及以后的元素都后移,空出i插入新结点;

倘若,插入点在表末尾则直接插入,无需移动。

算法实现:

#define Ok     1
#define ERROR  0

int  Inslist(SeqList *L,int i,int e)  
{
    int k;
    if((i<1)||(i>L->last+2))              /*判断插入位置是否合法*/
    {
        cout<<"插入位置i不合法!"<<endl;
        return ERROR;
    }

    if(L->last >= MAXSIZE-1)             /*检查表是否已满*/
    {
        cout<<"该表已满!"<<endl;
        return ERROR;
    }

    for(k=L->last;k>i-1;k--)            /*移动i及以后的元素*/
    {
        L->elem[k+1]=L->elem[k];
    }

    L->elem[i-1]=e;                     /*插入数据*/
    L->last++;

    return OK;
}/*Inslist*/
(三)删除操作

算法描述:类似于插入操作,除了最后一个元素,再说删除其中一个元素时都需要移动其以后的元素。

(1)按序号删除

算法实现:

<pre name="code" class="cpp"><pre code_snippet_id="1631550" snippet_file_name="blog_20160401_4_2990445" name="code" class="cpp">#define Ok     1
#define ERROR  0



int DelList(SeqList *L,int i,int *e)
{
int k;
if((i<1)||(i>L->last+1))              /*判断删除位置是否合法*/
{
cout<<"删除位置i不合法!"<<endl;
return ERROR;
}
*e = L->elem[i-1];                    /*将删除的值给e返回*/

for(k=i;k<=L->last;k++)                /*将删除元素位置以后的元素依次往前移动一个位置*/
{
L->elem[k-1]=L->elem[k];
}

L->last--;

return OK;
}/*DelList*/



</pre><pre>






(2)按元素删除

算法实现:

<pre name="code" class="cpp"><pre code_snippet_id="1631550" snippet_file_name="blog_20160401_5_9696802" name="code" class="cpp">#define Ok     1
#define ERROR  0
</pre><pre>
int DelListByElem(SeqList *L,int e,int *i)
{
int j=0;                             /*扫面计数器,从第一个开始*/
int k;

while((j<L->last)&&(L->elem[j]!=e))  /*顺序扫表,知道找到e或是扫描结束*/
i++;

if(j<=L->last)                       /*找到元素*/
{
for(k=j;k<L->last;k++)           /*将删除元素位置以后的元素依次往前移动一个位置*/
{
L->elem[k]=L->elem[k+1];     /*注意这里同按位置删除的区别*/
}

L->last--;
retun OK;
}
else                                 /*没有找到元素*/
{
cout<<"表中不存在元素e!"<<endl;
return ERROR;
}
}/*DelListByElem*/





(四)合并操作
将两个元素均是递增(或递减)排列的顺序表LA,LB,将他们合并到一个新表LC中。

LC中的元素也要是有序。

void merge(SeqList *LA,SeqList *LB,SeqList *LC)
{
int i=0,j=0,k=0;

while(i<LA->last&&j<=LB->last)
{
if(LA->elem[i]<=LB->elem[j])           /*LA中元素比LB中小*/
{
LC->elem[k]=LA->elem[i];
k++;
i++;
}
else
{
LC->elem[k]=LB->elem[j];       /*LB中元素比LA中小*/
k++;
j++;
}
}/*while*/

while(i<=LA->last)                             /*LA中元素有剩余,将剩下的全插到LC后面*/
{
LC->elem[k]=LA->elem[i];
k++;
i++;
}/*while*/

while(j<=LB->last)                            /*若LB中元素有剩余,则将剩下的全插到LC后面*/
{
LC->elem[k]=LB->elem[j];
k++;
j++;
}/*while*/

/*特别注意的是,last不是元素个数,是最后一个元素的下标*/
LC->last = LA->last +LB->last +1;
}/*merge*/


顺序表的基本操作大致就是以上这些内容,若有错误之处,敬请指正!

接下来将会逐步更新数据结构的其他内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: