1. 程式人生 > >循序漸進學習資料結構之線性表

循序漸進學習資料結構之線性表

一、思維導圖

二、線性表的基本概念

1.名詞解釋:

線性表:由n個數據特性相同的元素構成的有限序列,有順序儲存和鏈式儲存兩種表示形式。

空表:線性表中元素的個數n=0的表。

線性表的鏈式儲存結構:特點是用一組任意的儲存單元儲存線性表的資料元素,包括兩個域,其中儲存資料元素資訊的域稱為資料域,儲存直接後繼儲存位置的域稱為指標域。

迴圈單鏈表:是另一種形式的鏈式儲存結構。它的特點是表中最後一個結點的指標域指向頭結點,整個連結串列形成一個環。

迴圈雙鏈表:是另一種形式的鏈式儲存結構。它的特點是表中最後一個結點的指標域指向頭結點,頭節點同時指向最後一個節點,整個連結串列形成一個環。(這個圖畫的太醜啦!!)

雙向連結串列:是指有兩個指標域,其一指向直接後繼,另一指向直接前趨。

線性結構:若結構是非空有限集,則有且僅有一個開始結點和一個終端結點,並且所有結點都最多隻有一個直接前趨和一個直接後繼。

非空線性表或線性結構特點: 1.存在唯一的一個被稱作“第一個”的資料元素;2.存在唯一的一個被稱作“最後一個”的資料元素;3.除第一個之外,結構中的每個資料元素均只有一個前驅;4.除最後一個之外,結構中的每個資料元素均只有一個後繼

2.儲存結構

1.順序表

1.特點

(一)利用資料元素的儲存位置表示線性表中相鄰資料元素之間的前後關係,即線性表的邏輯結構與儲存結構一致
(二)在訪問線性表時,可以快速地計算出任何一個數據元素的儲存地址。因此可以粗略地認為,訪問每個元素所花時間相等

這種存取元素的方法被稱為隨機存取法

2.優缺點

優點: 儲存密度大(結點本身所佔儲存量/結點結構所佔儲存量);可以隨機存取表中任一元素

缺點:在插入、刪除某一元素時,需要移動大量元素;浪費儲存空間;屬於靜態儲存形式,資料元素的個數不能自由擴充。
 
 

為了克服這樣的缺點---連結串列

2.連結串列

連結串列各結點由兩個域組成:資料域:儲存元素數值資料;指標域:儲存直接後繼結點的儲存位置

頭指標:指向連結串列中第一個結點的指標

頭結點:在連結串列的首元結點之前附設的一個結點;資料域內只放空表標誌和表長等資訊

首元結點:指連結串列中儲存第一個資料元素a1的結點

連結串列中設定頭結點的好處:

⒈便於首元結點的處理
首元結點的地址儲存在頭結點的指標域中,所以在連結串列的第一個位置上的操作和其它位置一致,無須進行特殊處理;

⒉便於空表和非空表的統一處理
無論連結串列是否為空,頭指標都是指向頭結點的非空指標,因此空表和非空表的處理也就統一了。
頭結點的資料域可以為空,也可存放線性表長度等附加資訊,但此結點不能計入連結串列長度值。

1.特點

(一)結點在儲存器中的位置是任意的,即邏輯上相鄰的資料元素在物理上不一定相鄰
(二)訪問時只能通過頭指標進入連結串列,並通過每個結點的指標域向後掃描其餘結點,所以尋找第一個結點和最後一個結點所花費的時間不等 

這種存取元素的方法被稱為順序存取法

2.優缺點

優點: 儲存密度小(結點本身所佔儲存量/結點結構所佔儲存量);刪除或者插入操作時間複雜度低

缺點:在查詢的時候需要從頭節點開始查詢,時間複雜度高。

為了克服這樣的缺點---雙鏈表,迴圈連結串列等

三、線性表的基本操作

1.順序表的基本操作:

1.初始化順序表(引數用引用):

Status InitList_Sq(SqList &L){                //構造一個空的順序表L
    L.elem=new ElemType[MAXSIZE];   //為順序表分配空間
    if(!L.elem) exit(OVERFLOW);            //儲存分配失敗
    L.length=0;                    //空表長度為0
    return OK;
}

1.初始化順序表(引數用指標):

Status InitList_Sq(SqList *L){                    //構造一個空的順序表L
    L->elem=new ElemType[MAXSIZE];   //為順序表分配空間
    if(!L->elem) exit(OVERFLOW);            //儲存分配失敗
    L->length=0;                                    //空表長度為0
    return OK;
}

2.取值(根據位置i獲取相應位置資料元素的內容) :

int GetElem(SqList L,int i,ElemType &e)
{
  if (i<1||i>L.length) 
    return 0;                            //判斷i值是否合理,若不合理,返回0  
  e=L.elem[i-1];                           //第i-1的單元儲存著第i個數據
  return 1;
}

3.查詢(根據指定資料獲取資料所在的位置 ) :
線上性表L中查詢值為e的資料元素

int LocateELem(SqList L,ElemType e)
{
  for (i=0;i< L.length;i++)
      if (L.elem[i]==e) return i+1;                
  return 0;
}

4.插入(插入到第i個結點之前 ) :

Status ListInsert_Sq(SqList &L,int i ,ElemType e){
   if(i<1 || i>L.length+1) return ERROR;             //i值不合法
   if(L.length==MAXSIZE) return ERROR;      //當前儲存空間已滿     
   for(j=L.length-1;j>=i-1;j--) 
       L.elem[j+1]=L.elem[j];                              //插入位置及之後的元素後移
    L.elem[i-1]=e;                                                //將新元素e放入第i個位置
    ++L.length;                                //表長增1
    return OK;
}

5.刪除(刪除第i個結點) :

Status ListDelete_Sq(SqList &L,int i){
   if((i<1)||(i>L.length)) return ERROR;    //i值不合法
   for (j=i;j<=L.length-1;j++)                   
    L.elem[j-1]=L.elem[j];                      //被刪除元素之後的元素前移  
   --L.length;                                             //表長減1
  return OK;
}

2.單鏈表的基本操作:

1. 初始化

【演算法步驟】

(1)生成新結點作頭結點,用頭指標L指向頭結點。
(2)頭結點的指標域置空。

Status InitList_L(LinkList &L){ 
   L=new LNode;                     
   L->next=NULL;     
   return OK; 
} 

2. 取值(根據位置i獲取相應位置資料元素的內容)

Status GetElem_L(LinkList L,int i,ElemType &e){ 
     p=L->next;j=1;                     //初始化
     while(p&&j<i){          //向後掃描,直到p指向第i個元素或p為空 
       p=p->next; ++j; 
     } 
     if(!p || j>i)return ERROR;  //第i個元素不存在 
     e=p->data;                            //取第i個元素 
     return OK; 
}

3. 查詢
根據指定資料獲取資料所在的位置

// 在連結串列L中查詢值為e的資料元素,並返回該結點
LNode *LocateELem_L (LinkList L,Elemtype e) {
 //返回L中值為e的資料元素的地址,查詢失敗返回NULL
  p=L->next;
  while(p &&p->data!=e)  
        p=p->next;                      
  return p;     
} 

4.插入

【演算法步驟】
(一)找到ai-1儲存位置p

(二)生成一個新結點*s

(三)將新結點*s的資料域置為x

(四)新結點*s的指標域指向結點ai

(五)令結點p的指標域指向新結點s

// 核心程式碼
s->next=p->next;  
p->next= s;
//在L中第i個元素之前插入資料元素e 
Status ListInsert_L(LinkList &L,int i,ElemType e){ 
      p=L;j=0; 
      while(p&&j<i−1){p=p->next;++j;}   //尋找第i−1個結點 
      if(!p||j>i−1)return ERROR;                  //i大於表長 + 1或者小於1  
      s=new LNode;          //生成新結點s 
      s->data=e;                         //將結點s的資料域置為e 
      s->next=p->next;                   //將結點s插入L中 
      p->next=s; 
      return OK; 
}//ListInsert_L 

5.刪除

【演算法步驟】

(一)找到ai-1儲存位置p

(二)儲存要刪除的結點的值

(三)令p->next指向ai的直接後繼結點

(四)釋放結點ai的空間

int ListDelete_L(LinkList &L,int i,ElemType &e){
    p=L;j=0; 
    while(p->next &&j<i-1){             //尋找第i個結點,並令p指向其前驅 
        p=p->next; ++j; 
    } 
    if(!(p->next)||j>i-1) return 0;      //刪除位置不合理 
    q=p->next;                                   //臨時儲存被刪結點的地址以備釋放 
    p->next=q->next;                   //改變刪除結點前驅結點的指標域 
    e=q->data;                               //儲存刪除結點的資料域 
    delete q;                                //釋放刪除結點的空間 
    return 1; 
}

3.雙向連結串列的基本操作

1.雙向連結串列的插入:

// 核心程式碼
1. s->prior=p->prior;
2. p->prior->next=s;
3. s->next=p;
4. p->prior=s;
Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){
   if(!(p=GetElemP_DuL(L,i))) return ERROR;
    s=new DuLNode; 
   s->data=e;
   s->prior=p->prior;  
   p->prior->next=s;
   s->next=p;  
   p->prior=s;
   return OK;
}

2.雙向連結串列的刪除:

// 核心程式碼
1. p->prior->next=p->next;

2. p->next->prior=p->prior;
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){
   if(!(p=GetElemP_DuL(L,i)))     return ERROR;
   e=p->data;
   p->prior->next=p->next;
   p->next->prior=p->prior;
   delete p; 
   return OK;
}

4.迴圈連結串列的基本操作

理解單鏈表和雙向連結串列的操作,迴圈連結串列的操作也類似。這裡不在贅述。

四、比較順序表和單鏈表

歡迎關注公眾號:coder辰砂 (一個認認真真寫東西的公眾號)

相關推薦

循序漸進學習資料結構線性

一、思維導圖 二、線性表的基本概念 1.名詞解釋: 線性表:由n個數據特性相同的元素構成的有限序列,有順序儲存和鏈式儲存兩種表示形式。 空表:線性表中元素的個數n=0的表。 線性表的鏈式儲存結構:特點是用一組任意的儲存單元儲存線性表的資料元素,包括兩個域,其中儲存資料元素資訊的域稱為資料域,儲存直接後繼儲

資料結構線性學習總結

   鑑於自己的資料結構知識較為薄弱,並且自己常常學完沒幾天又忘了,每次用起來都要去查閱,所以現在開個部落格來記錄自己在學資料結構過程中自己的一些學習總結,也可以加深自己的理解。 第一篇要總結的是線性表。 線性表:零個或多個相同特性的資料元素的有限序列。首先它是一個序列

資料結構 線性的實現

 程式碼: #include<algorithm> #include<iostream> #include<stdlib.h> #define MAXSIZE 1100 using namespace std; /* 線性表的實現 1.插入//o

資料結構線性演算法的構建與應用

  //資料結構值順序線性表的實現與應用 //c++程式碼進行實現 //sqlist.h程式碼                     //線性表的初始化 #def

資料結構線性

線性表的邏輯結構 線性表是由n個型別相同的資料元素組成的有限序列,記為(a1,a2,…,ai-1,ai,ai+1,…,an)。其中,這裡的資料元素可以是原子型別,也可以是結構型別。線性表的資料元素存在著序偶關係,即資料元素之間具有一定的次序。線上性表中,資料元

資料結構線性(二)

資料結構之線性表一主要講的是線性表的順序儲存結構和鏈式儲存結構的實現和程式碼。這次我們來討論下靜態連結串列,迴圈連結串列和雙向連結串列。 靜態連結串列 我們讓陣列每個元素都是由兩個資料域組成:data和cur。資料域data用來儲存資料元素,cur相當於我們連結串列中的n

常見資料結構線性

線性表 線性表(List):由零個或多個數據元素組成的有限序列。 線性結構是最簡單,也是最常用的資料結構之一。 線性結構的特點是:在資料元素的有限集中,除第一個元素無直接前驅,最後一個元素無直接後驅外,每個元素資料有且僅有一個直接前驅元素和一個直接後續元素。   線性表---順序

資料結構線性 -- 連結串列(總括)

今天來總結一下連結串列。  首先,   什麼是連結串列?     就是採去鏈式儲存結構的線性表,所謂鏈式儲存就好比火車的車廂一樣,一節一節的連線起來,成為一個線性表。這種方式採用動態儲存分配方式,即

資料結構線性的順序儲存結構

1.線性表定義:線性表是零個或多個數據元素的有限序列。兩種物理結構:順序儲存結構和鏈式儲存結構。 2.線性表的順序儲存結構定義:是指用一段地址連續的資料單元依次儲存線性表的資料元素。說白了就是在記憶體中佔用一塊空間,然後將相同資料型別的元素依次存入。 線上性表的定義中,指出是用一段地址連續的資料單元儲存線

資料結構線性—淺談單鏈有頭結點和無頭節點

有頭結點的連結串列統一了演算法的實現,無頭節點減少了節點個數,但是隻有根據實際情況選用真正的有無頭節點連結串列 待續://程式碼實現 待續://程式碼實現 待續://程式碼實現 /*****************************************

C語言資料結構線性的基本操作

線性表的基本操作 內容: (1)順序表的操作 輸入一組整型元素序列,建立線性表的順序儲存結構。實現該線性表的遍歷。在該順序表中查詢某一元素,查詢成功顯示查詢元素,否則顯示查詢失敗。在該順序表中刪除或插入指定元素。 建立兩個按值遞增有序的順序表,將他們合併成一個按值遞增有序的

資料結構線性總結】

前言: 這幾天在學習資料結構,引用書中的一句話:資料結構 = 程式 + 演算法;本篇部落格作為一個知識的總結,希望給大家帶來幫助. 核心 : 線性表定義 從字面意義來看,呈線性,所以說

c語言版資料結構線性歸併大概

線性表:n個具有相同特性的資料元素的有限序列。較為靈活,可根據需要増長或縮短。 兩線性表歸併演算法:(此時已知其元素按值非遞減排列) void MergeList(List La, List Lb,

(一)資料結構線性的簡單實現:連結串列

/* 查詢連結串列中第K個元素 */ List *FindKth( int K, List *PtrL ) { List *p = PtrL; int i = 1; while (p != NULL && i < K ) { p = p->Next; i++;

C++資料結構線性

InitList( ):初始化順序表Insert(int L,int Elem):在L位置插入值Elem1.檢查記憶體空間是否夠,如果實際長度大於或等於最大容量,則要用realloc擴充套件記憶體空間2.判斷插入的位置L是否合法3.如果插入到表頭或表中,則要把元素往後挪。如果

資料結構線性(順序,單鏈,迴圈連結串列,雙向連結串列)-- 圖書管理系統

順序表 #include <iostream> #include <cstring> #include <cstdlib>///exit()標頭檔案exit(0):正常執行程式並退出程式。exit(1):非正常執行導致退出程式 #incl

基於C/C++語言資料結構線性(一)

資料結構學習筆記: 資料結構的重要性:資料結構我感覺很重要,不僅僅是考試很重要,而且在以後程式設計師事業上都是尤為重要的,知乎上有網友評價資料結構是最重要的程式設計基本能力,沒有之一。我感覺這個說法很對,並且大家都知道,資料結構與演算法這種說法常常被大家使用,就是因為資料

資料結構線性的鏈式儲存實現(附完整程式碼)

順序表插入、刪除時需要通過移動資料來實現,影響了執行效率。 而連結串列不要求邏輯上相鄰的兩個資料元素物理上也相鄰,因此對線性表的插入、刪除不需要移動資料元素,只需要修改鏈。 下面介紹帶頭結點的鏈式表: 資料結構: typedef int ElementType; ty

資料結構線性的順序儲存結構(陣列)的插入與刪除

線性表的順序存數結構:指的是用一段地址連續的儲存單元一次儲存線性表的資料元素      在記憶體中找塊記憶體,把相同資料型別的資料元素一次存放在這塊空間中。可以用以為陣列來實現順序儲存結構。陣列的長

資料結構3----線性中鏈式結構的其他幾種實現(霜小刀)

歡迎轉載和引用,若有問題請聯絡 若有問題,請聯絡 Email : [email protected] QQ:2279557541 前言   鏈式結構除了上一篇結構中所講的單項鍊表外, 還有另外幾種。按照<大話資料結構>中所說 包括