线性表之基于数组的实现

来源:互联网 发布:福建网络电视台电话 编辑:程序博客网 时间:2024/06/07 15:24

欢迎关注,大家共同学习!

线性表是有n个元素组成的有限序列,有两种存储结构:顺序存储结构和链式存储结构,这一篇简单介绍顺序存储结构。

顺序存储结构的特点:

(1)、它的物理顺序和物理顺序一致;

(2)、数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现的;

由于数组具有以上特点,因此可以基于数组来实现顺序存储结构。先来看看它的定义,我们用结构体来实现;

typedef struct sqlist{    ElemType Elem_array[MAX_SIZE];    int length;}SqList;
这个结构体包含两项,一个是底层数组,一个表示数组的当前长度;
在线性表中,一般还会涉及到一些基本操作,比如初始化、插入、删除、查找、修改、求长度等,下边一一实现这些功能;

   1、顺序线性表的初始化:

Status SqList_Init(SqList *L){            L->length=0;            return OK;}
2、顺序线性表的插入:

Status SqList_Insert(SqList *L,int i,ElemType e){    if(i<0||i>(L->length)) return ERROR;    if((L->length)>=MAX_ARRAY_SIZE)    {        cout<<"线性表溢出!"<<endl;        return ERROR;    }    for(int j=L->length;j>i;j--)        L->Elem_array[j]=L->Elem_array[j-1];    L->Elem_array[i]=e;    L->length++;    return OK;}

3、顺序线性表的删除:

Status SqList_Delete(SqList *L,int i,ElemType *temp){    if(i<0||i>(L->length-1)) return ERROR;    if((L->length)<=0)    {        cout<<"线性表空!"<<endl;        return ERROR;    }     *temp=L->Elem_array[i];    for(int j=i+1;j<=L->length-1;j++)    {        L->Elem_array[j-1]=L->Elem_array[j];    }    L->length--;    return OK;}

4、顺序表的定位查找删除:从表中查找第一个值为x的元素删除

Status SqList_Locate_Delete(SqList *L,ElemType x){    int i=0,k;    while(i<L->length)    {        if(x!=L->Elem_array[i])            i++;        else        {            for(k=L->length-1;k>i;k++)            {                L->Elem_array[k-1]=L->Elem_array[k];            }            L->length--;            break;        }    }    if(i>L->length)    {        cout<<"删除的元素不存在!"<<endl;        return ERROR;    }    return OK;}
5、顺序表的查找:即返回查找值的下标

Status SqList_Search(SqList *L,ElemType e){    int i=0;    while(i<L->length)    {        if(e!=L->Elem_array[i])            i++;        else        {            return i;            break;        }    }    if(i>L->length)    {        cout<<"查找的元素不存在!"<<endl;        return ERROR;    }}

6、顺序表返回长度

Status SqList_getLength(SqList *L){    return L->length;}
顺序存储结构的线性表比较简单,简单的介绍就到这里,下边是测试代码:

#include <iostream>#define OK 1#define ERROR -1#define MAX_ARRAY_SIZE 100typedef int Status;typedef int ElemType;using namespace std;//typedef struct sqlist{    ElemType Elem_array [MAX_ARRAY_SIZE];    int length;}SqList;Status SqList_Init(SqList *L){            L->length=0;            return OK;}Status SqList_Insert(SqList *L,int i,ElemType e){    if(i<0||i>(L->length)) return ERROR;    if((L->length)>=MAX_ARRAY_SIZE)    {        cout<<"线性表溢出!"<<endl;        return ERROR;    }    for(int j=L->length;j>i;j--)        L->Elem_array[j]=L->Elem_array[j-1];    L->Elem_array[i]=e;    L->length++;    return OK;}Status SqList_Delete(SqList *L,int i,ElemType *temp){    if(i<0||i>(L->length-1)) return ERROR;    if((L->length)<=0)    {        cout<<"线性表空!"<<endl;        return ERROR;    }     *temp=L->Elem_array[i];    for(int j=i+1;j<=L->length-1;j++)    {        L->Elem_array[j-1]=L->Elem_array[j];    }    L->length--;    return OK;}Status SqList_Locate_Delete(SqList *L,ElemType x){    int i=0,k;    while(i<L->length)    {        if(x!=L->Elem_array[i])            i++;        else        {            for(k=L->length-1;k>i;k++)            {                L->Elem_array[k-1]=L->Elem_array[k];            }            L->length--;            break;        }    }    if(i>L->length)    {        cout<<"删除的元素不存在!"<<endl;        return ERROR;    }    return OK;}Status SqList_Search(SqList *L,ElemType e){    int i=0;    while(i<L->length)    {        if(e!=L->Elem_array[i])            i++;        else        {            return i;            break;        }    }    if(i>L->length)    {        cout<<"查找的元素不存在!"<<endl;        return ERROR;    }}Status SqList_getLength(SqList *L){    return L->length;}int main(){    int temp,location;    SqList L;    SqList_Init(&L);    cout<<"表中插入了元素:"<<endl;    for(int i=0;i<10;i++)    {        SqList_Insert(&L,i,i+1);        cout<<L.Elem_array[i]<<endl;    }    SqList_Delete(&L,4,&temp);    cout<<"删除了:"<<temp<<endl;    location=SqList_Search(&L,6);    cout<<"查找元素6的位置是:"<<location<<endl;    cout<<"修改后的表:"<<endl;    for(int i=0;i<SqList_getLength(&L);i++)    {        cout<<L.Elem_array[i]<<endl;    }    cout<<"表长:"<<L.length<<endl;    return 0;}





原创粉丝点击