大话数据结构学习(1)线性表的顺序存储结构

1.线性表定义:0个或多个数据元素的有限序列。
2.线性表的顺序存储结构:是指用一段地址连续的存储单元依次存储线性表的数据元素。
3.线性表的顺序存储结构通常可借助数组实现。
注意:①一般,数组长度固定;线性表长度可变。因此,用数组存放线性表数据时,定义的数组大小要大于等于线性表长度。②线性表中的元素从1开始数,数组下标从0开始,因此,数组a[0]存放线性表的第1个数,同理,a[i]存放第i+1个数。

4.线性表顺序存储结构的优缺点:
这里写图片描述

5.代码实现:

#include <stdlib.h>
#include <iostream>



/************************************************************************/
/*          (1)线性顺序存储:地址连续                                      */                               
/************************************************************************/
#define MaxSize 20  //存储空间初始分配量
#define  OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;     //Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int ElemType;       //元素类型依据实际情况决定
Status visit(ElemType c)
{
    printf("%d",c);
    return OK;
}

typedef struct      //定义SqList线性表结构
{
    ElemType data[MaxSize];
    int length;
}SqList;

//初始化顺序线性表
Status InitList(SqList *L)
{
    L->length=0;
    return OK;
}

/*  初始条件:顺序线性表L已存在。操作结果:若L为空表,返回true;否则返回false*/
Status ListEmpty(SqList L)
{
    if(L.length == 0)
        return TRUE;
    else
        return FALSE;
}

/*  初始条件:顺序线性表已经存在。操作结果:将L重置为空表*/
Status ClearList(SqList *L)
{
    L->length=0;
    return OK;
}

/*  初始条件:L顺序线性表L已经存在。操作结果:返回L中数据元素的个数*/
int ListLength(SqList L)
{
    return L.length;
}

/*  初始条件:顺序线性表L已经存在,1=<i<=ListLength(L)*/
/*  操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第一个位置下标从0k开始*/
Status GetElem(SqList L,int i,ElemType *e)
{
    if(L.length==0 ||i<1 ||  i>L.length)
        return ERROR;
    *e = L.data[i-1];

    return OK;
}

/*  初始条件:顺序线性表L已经存在*/
/*  操作结果:返回L中第一个与e满足关系的数据元素的位序;若这样的元素不存在,则返回0*/
int LocateElem(SqList L,ElemType e)
{
    int i;
    if (L.length == 0)
        return 0;
    for (i=0;i<L.length;i++)
    {
        if (L.data[i] ==e)
            break;
    }
    if (i>=L.length)
        return 0;
    return i+1;
}

/*  初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/*  操作结果:在L中的第i个位置之前插入新的元素e,L的长度加1*/
Status ListInsert(SqList *L, int i,ElemType e)
{
    int k;
    if(L->length == MaxSize)
        return ERROR;
    if (i<1 || i>L->length +1)  //插入的位置i比第一个位置小、或比最后一个位置大
        return ERROR;
    if (i<=L->length)
    {
        for (k=L->length-1;k>=i-1;k--)
        {
            L->data[k+1] = L->data[k];//位置i及其后面的元素统一后移一位
        }

    }
    L->data[i-1]=e; //插入新元素
    L->length++;//线性表长度加1
    return OK ;
}

/*  初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/*  操作结果:删除第i个数据元素,并用e返回其值,L的长度减1*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
    if (L->length == 0)
        return ERROR;
    if (i<1 || i>L->length+1)
        return ERROR;
    *e=L->data[i-1];
    if (i<=L->length)
    {
            for(int k=i-1;k<L->length-1;k++)
            L->data[k]=L->data[k+1];    
    }
    L->length--;
    return OK;
}

/*  初始条件:顺序线性表L已经存在*/
/*  操作结果:依次对L的每个数据元素输出*/
Status ListTravese(SqList L)
{
    int i;
    for (i=0;i<L.length;i++)
        visit(L.data[i]);   //这个visit函数是在最开始自定义的打印输出函数
    printf("\n");
    return OK;

}

//将两个顺序线性表组合为一个线性表
void unionL(SqList *La,SqList Lb)
{
    int La_len,Lb_len,i;
    ElemType e;
    La_len=La->length;
    Lb_len=Lb.length;

    for(int i=0;i<Lb_len;i++)
    {
        GetElem(Lb,i,&e);
        if (!LocateElem(*La,e))
        {
            ListInsert(La,++La_len,e);
        }
    }

}

int main()
{
    SqList L;
    ElemType e;
    Status i;
    int j,k;
    i=InitList(&L);
    printf("初始化L之后:L.length=%d",L.length);
    printf("\n");
    for(j=1;j<=5;j++)
        i=ListInsert(&L,1,j);

    printf("在表头依次插入1~5之后:L.data=\n");
        ListTravese(L);
        /*for(int k=0;k<L.length;k++)
            printf("%d",L.data[i]);*/
    printf("L.length=%d\n",L.length);
    printf("\n");

        i=ListEmpty(L);
        printf("L是否为空:i=%d(1:是;0:否)\n",i);

        i=ClearList(&L);
        printf("清空L后:L.length=%d\n",L.length);

        i=ListEmpty(L);
        printf("判断L是否为空i=%d\n",i);

        for(j=1;j<=10;j++)
            ListInsert(&L,j,j);
        printf("在对应位置依次插入1~10之后,L.data=");
            ListTravese(L);
            printf("\n");
        printf("L.length=%d\n",L.length);

        ListInsert(&L,1,2);
        printf("在表头插入0后,L.data=");
        ListTravese(L);
        printf("\n");
        printf("L.length=%d\n",L.length);

        GetElem(L,5,&e);
        printf("第5个元素是:%d\n",e);

        getchar();


}

猜你喜欢

转载自blog.csdn.net/zhangying_496/article/details/81203901