1. 程式人生 > >(期末第三更)線性表

(期末第三更)線性表

(所有事情都堆一起,現在擔心的是密碼學過不了,大物還掛掉。。。。大哭

正文:

本文主要內容:

  1. 線性表的邏輯結構定義、抽象資料型別定義。
  2. 線性表的兩類儲存結構(順序的和鏈式的)和它們的型別定義。
  3. 線上性表的兩類儲存結構上實現基本操作。

一、線性表的型別定義

概念:線性表是n個型別相同資料元素有限序列。(n可以為0)

線性結構定義:線上性表中,除了第一個元素和最後一個元素之外,其他元素都有且僅有一個直接前驅,有且僅有一個直接後繼,具有這種結構特徵的儲存結構成為線性結構。線性表是一種線性結構。


抽象型別 線性表List的定義:

ADT List{

資料物件:D={ai|ai屬於ElemSet,i=1,2……,n}

資料關係:S={<ai-1,ai>}

基本操作:

InitList(&L)

結果:構造一個空的線性表L。

Destory(&L)

條件:線性表L已存在。

結果:銷燬線性表L

……

}

二、線性表的儲存結構(順序表示和鏈式表示)

1.順序儲存結構

  • 記憶體狀態

說明:線性表元素之間的邏輯關係,可通過元素的儲存順序反映出來,所以只需儲存資料元素的資訊。而且,順序儲存結構可以隨機存取,不過插入刪除較麻煩,所以又被稱為隨機存取儲存結構。

(以後就按這個順序來哈,記憶體中狀態->型別定義->基本操作)

  • 順序表型別定義:
#define LISE_INIT_SIZE 100//儲存空間的初始分配量
#define LISTINCREMENT 10//分配增量
typedef struct{
Elemtype *elem;//線性表儲存空間的基址
int length;//當前線性表長度
int listsiaze;//當前分配的線性表的儲存空間大小
}SqList;
  • 基本操作:

不方便的插入操作ListInitsert_Sq(SqList &L,int i,ElemType e);

//在順序線性表L中第i個位置之前插入新的元素e

// i的合法值為1≤i≤ListLength_Sq(L)+1

Status ListInsert_Sq(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize){
    newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
    if(!newbase) exit(OVERFLOW);
    L.elem = newbase;//新基址
    L.listsize+=LISTINCREMENT;
}//越界處理
q = &(L.elem[i-1]);//找到第i個元素位置
for(p = &L.elem[L.length-1];p>=q;--p)    *(p+1)=*p;//後移元素
*q = e;//插入新元素
++L.length;
return OK;
}

演算法時間複雜度分析:O(n)


不方便的刪除操作 ListDelete_Sq ( SqList &L, int i, ElemType &e ) ;

//功能:刪除順序表L的第i個元素,並用e返回

Status  ListDelete_Sq ( Sqlist  &L ,int  i ,ElemType  &e ) {
//在順序線性表L中刪除第.i個元素,並用e返回其值
// i的合法值為  1≤i≤L.length
// 表空L.length=0 則i>L.length
if(i<1||i>L.length) return ERROR;
p = &(L.elem[i-1]);//找到第i個元素
e = *p;
q = L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++q)    *(p-1)=*p;//前移
--L.length;
return OK;
}

演算法時間複雜度分析:O(n)

(一點了,太累了,睡了睡了,今早起床再更難過

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(隔一天接著更,資料結構考試還有四天)

2.鏈式儲存結構

線性連結串列的概念:用一組任意的儲存單元線性表中的資料元素,對每個資料元素除了儲存自身的資料外,還儲存了直接後繼元素的儲存位置,所以每個結點至少包括資料域和指標域。(可以認為將線性表分散在系統可以控制的零散空間中的元素用指標串起來,組成一個有序的線性表)

元素的儲存可以是連續的,也可以說是不連續的。

  • 記憶體表示

注:第一個是資料域,第二個是指標域

  • 型別定義
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}Lnode,*LinkList;

線性連結串列有關術語:

  1. 頭指標:用於存放線性連結串列的第一個節點的儲存位置
  2. 空指標:不指向任何結點,線性連結串列最後一個結點的指標通常是空指標
  3. 頭指標:線性表的首元結點前面的一個附加結點
  4. 帶頭結點的線性連結串列:首元結點前面增加頭節點的線性連結串列(增加頭結點是為了方便運算的實現)

  • 基本操作