02.線性表(一)順序儲存結構,02線性

來源:互聯網
上載者:User

02.線性表(一)順序儲存結構,02線性
順序儲存結構一、線性表基本概念1.線性表定義    線性表(list)是指零個或多個資料元素的有限序列,所有資料元素為相同資料類型且一個資料元素可以由多個資料項目組成。若將線性表記為(a1,..ai-1,ai,ai+1...,an),線性表元素的個數n(n>0,n=0時為空白表)定義為線性表的長度,其中ai-1是ai 的直接前驅元素,ai+1是ai的直接後繼元素。2.線性表的抽象資料類型 ADT 線性表(List) Data    線性表的資料對象集合為{a1,a2,....an},每個元素的類型均勻DataType。其中,除了第一個元素a1外,每一個元素有且只有一個直接前驅元素;除了最後一個元素an外,每一個元素有且只有一個直接後繼元素。資料元素之間的關係是一對一的關係。Operation    Initlist(*L):初始化操作,建立一個空的線性表L;    ListEmpty(L):若線性表為空白,返回true,否者返回false;    ClearList(*L):將線性表清空;    GetElem(L,i,*e):將線性表L中的第i個位置元素的值返回給e;    LocateElem(L,e):線上性表L中尋找與給定值e相等的元素,如果尋找成功,返回該元素在表中序號表示成功;否者,返回0表示失敗    ListInsert(*L,i,e):線上性表L中的第i個位置插入新元素e;    ListDelete(*L,i,e):刪除線性表L中的第i個位置元素,並用e返回其值;    ListLength(L):返回線性表L的元素個數注釋:傳遞參數L和*L作用?3.線性表的儲存結構     順序儲存結構、鏈式儲存結構二、線性表的順序儲存結構1.順序儲存定義       線性表的順序儲存結構,指的是用一段地址連續的儲存單元依次儲存線性表的資料類型相同的資料元素,在C語言中通常使用一維數組來實現順序儲存結構。2.順序儲存結構3個屬性(1)儲存空間的起始位置;(2)資料長度,即指存放線性表的最大儲存容量,儲存分配後這個量是一般是不變的;(3)線性表長度,即指線性表中資料元素的個數,隨著線性表插入和刪除操作的進行,這個量是變化的。3.順序儲存結構的優缺點(1)優點a.無須為表示表中元素之間的邏輯關係而增加額外的儲存空間。b.可以快速的存取表中任一位置的元素。因為是數組實現順序儲存,我們可以直接通過數組下標存取資料元素。(2)缺點a.插入和刪除操作需要移動大量的元素。需要從最後一個元素開始遍曆,直到需插入或刪除線性表的第i個元素。b.當線性表長度變化較大時,難以確認儲存空間的容量c.造成儲存空間的"片段"。4.順行儲存結構的結構程式碼範例#define MAXSIZE 20        //儲存控制項初始分配空間大小typedef int ElemType;        //Elemtype即為int類型,假設資料元素的資料類型為inttypedef struct                    /*儲存結構的struc結構體*/{    ElemType data[MAXSIZE];    //資料存放區資料元素,最大值為MAXSIZE    int length;                             //線性表當前長度}SqList;其中,SqList就是struct結構體,如果以後我們需要定義一個struct結構體對象,可表現為SqList L。5.順序儲存結構的插入和刪除(1)獲得元素操作實現操作: GetElem(L,i,*e)----將線性表L中的第i個位置元素的值返回給e演算法思路:因為線性表中的第i位置的資料元素,實際儲存在數組下標為i-1的儲存單元(數組下標從0開始),即就是把資料的第i-1下標的值返回即可。源碼實現:/*初始條件---順序線性表L已經存在,且表長小於資料長度(1=<i<=ListLength(L)) *操作結果---用e返回L中第i個資料元素的值*/    #define OK 1    #define ERROR 0    typedef int Status;    //Status是int資料類型,將作為函數返回值類型,其值是函數結構狀態碼    Status GetElem(SqList L,int i,ElemType *e)//傳入參數,其中SqList為struct結構體類型、ElemType為int類型    {        if(L.length==0 || (i<1 || i>L.length))       //L.length為線性表長度                return ERROR;        else        {            *e=L.data[i-1];            //將儲存空間的第i-1位置的資料元素賦值到指標變數e所指向的空間中              return OK;        }    }(2)插入操作實現操作: ListInsert(*L,i,e)----線上性表L中的第i個位置插入新元素e演算法思路:a.首先判斷非法插入情況:線性表長度大於儲存空間的長度;插入位置不合理;b.從最後一個元素開始向前遍曆到第i個位置,分別將它們都向後移動一個位置;c.將新元素插入線性表的第i個位置,儲存空間數組下標為i-1位置;d.線性表長度加1.源碼實現:/*初始條件---順序線性表L已經存在,且表長小於資料長度(1=<i<=ListLength(L)) *操作結果---線上性表L中的第i個位置插入新元素e,線性表長度加1*/    #define OK 1    #define ERROR 0    typedef int Status;            //Status是int資料類型,將作為函數返回值類型,其值是函數結構狀態碼    Status ListInsert(*L,i,e)    {        int k;                                //資料元素的儲存位置,i表示資料元素線上性表的位置        if(L->length==MAXSIZE)     //線性表長度大於資料長度,拋出異常                return ERROR;        if(i<1 || i>(L->length+1))       //插入位置不再儲存空間段,拋出異常                 return ERROR;        if(i<=L->length)            //插入位置符合條件,從最後一個元素開始向前遍曆到第i個位置        {              for(k=L->length-1;k>i;k--)               {                     L->data[k+1]=L->data[k];        //將儲存在位置k的資料元素,向後移動一位儲存                  }                 L->data[i-1]=e;    //將新元素插入到第i個線性表元素對應的第(i-1)儲存位置                L->length++;        //線性表長度加1                return OK;        }    }注釋:k資料元素的儲存位置,i表示資料元素線上性表的位置
(3)刪除操作實現操作:ListDelete(*L,i,e),刪除線性表L中的第i個位置元素,並用e返回其值演算法思路:a.首先判斷非法插入情況:線性表長度大於儲存空間的長度;刪除位元置不合理;b.取出刪除元素b.從最後一個元素開始向前遍曆到第i個位置,分別將它們都向前移動一個位置;d.線性表長度減1.源碼實現:/*初始條件---順序線性表L已經存在,且表長小於資料長度(1=<i<=ListLength(L)) *操作結果---線上性表L中的第i個位置插入新元素e,線性表長度加1*/    #define OK 1    #define ERROR 0    typedef int Status;            //Status是int資料類型,將作為函數返回值類型,其值是函數結構狀態碼    Status ListInsert(*L,i,e)    {        int k;                            //資料元素的儲存位置,i表示資料元素線上性表的位置        if(L->length==0)                return ERROR;        if(i<1 || i>(L->length+1))                return ERROR;        if(i<=L->length)            //插入位置符合條件,從最後一個元素開始向前遍曆到第i個位置        {              e=L->data[i-1];        //取出儲存位置為(i-1)的資料元素              for(k=L->length-1;k>i;k--)               {                     L->data[k-1]=L->data[k];        //將儲存在位置k的資料元素,向後移動一位儲存                  }                 L->length--;        //線性表長度加1                return OK;        }    }注釋:k資料元素的儲存位置,i表示資料元素線上性表的位置6.順序儲存結構效能分析(1)存、讀資料時間複雜度:線性表的順序儲存結構,在存、讀資料時,不管是哪個位置都是通過數組下標直接讀存、讀資料元素(執行一次),所以時間複雜度都是O(1);(2)插入或刪除時間複雜度:線性表的插入或刪除操作都需要從最後一個元素開始遍曆,直到需插入或刪除線性表的第i個元素。所以,時間複雜度為O(n);(3)適用範圍:元素個數不太變化(即少插入或刪除資料元素),而更多的是存取資料的應用。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.