大話數據結構學習(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();


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章