1. 程式人生 > >線性錶鏈式儲存的基本操作

線性錶鏈式儲存的基本操作

  線性表的順序儲存結構的特點是邏輯關係上相鄰的兩個元素在物理位置上也相鄰,因此可以隨機存取表中任意元素。線性錶鏈式儲存結構特點是用一組任意的儲存單元儲存資料元素,為了表示每個資料元素ai與其直接後繼資料元素ai+1之間的邏輯關係,對資料元素ai來說,除了儲存本身資訊外,還要儲存指示其直接後繼的資訊(即直接後繼的儲存位置)。這兩部分資訊稱為資料元素ai的儲存映像,稱為結點(node)。它包括兩個域,其中儲存資料資訊的稱為資料域,儲存直接後繼儲存位置的域稱為指標域。

1、線性表的單鏈表儲存結構

typedef struct Node{    //節點型別定義 
    ElemType data;      //
資料域 struct Node *next; //指標域 }Node,*LinkList; //LinkList為結構指標型別 LintList L; //為單鏈表的頭指標,也稱為單鏈表L

假設L是LinkList型變數,則L是單鏈表的頭指標,它指向表中第一個節點,若L為空(L=NULL),則所表示的線性表為空表,其長度n為0,有時我們在單鏈表的第一個結點前附設一個結點,稱為“頭結點”,頭結點的資料域可以不儲存任何資訊,頭結點的指標域指向第一個結點的指標(即第一個元素結點的儲存位置)。

2、初始化單鏈表

//單鏈表的初始化
Status ListInit_L(LinkList &L){//
構造一個空的單鏈表L L = (LinkList)malloc(sizeof(Node)); //產生一個頭節點,並使L指向此頭節點 if(!L) exit(OVERFLOW); //初始化失敗 L->next = NULL; //指標域為空 return OK; }

3、單鏈表的銷燬

//銷燬單鏈表
Status ListDelete_L(LinkList &L){//前提條件:單鏈表已經存在 
    LinkList q;
    if(L){
        q=L->next;//指向第一個節點 
        free
(L);//釋放L L=q; } retun OK; }

4、清空單鏈表

//單鏈表的清空
Status ListClear_L(LinkList &L){//前提條件,L存在,將L置為空表 
    LinkList p,q;
    p=L->next;
    while(p){
        q=p->next;
        free(p);
        p=q;
    }
    L->next=NULL;//頭節點指標域為空
    return 0; 
} 

5、判斷單鏈表是否為空

//判斷單鏈表是否為空
Status ListEmpty_L(LinkList &L){
    //初始條件:線性表L已存在
    //操作結果:若L為空表,則返回TRUE,否則返回FALSE
    if(L->next)//非空
        return true;
    else
        return false; 
}

6、計算單鏈表的長度

//計算單鏈表的長度
int ListLength_L(LinkList &L){
    //初始條件:線性表L已存在
    //操作結果:返回L中資料元素個數
    int i=0;
    LinkList p = L->next;    //指向第一個節點 
    while(p){//p沒到表尾
        i++;
        p=p->next; 
    }
    return i; 
}

 7、取元素

//取單鏈表中的資料元素
Status ListGet_L(LinkList &L,int i,ElemType &e){
    //初始條件:L為帶頭結點的單鏈表的頭指標
    //操作結果:當第i個元素存在時,其值賦給e並返回OK,否則返回ERROR
    int j=1;//計數器
    LinkList p=L->next;//指向第一個節點
    while(p || j<i){//順指標向後查詢,直到p指向第i個元素或p為空 
        p=p->next;
        j++;
    }
    if(!p || j>i)//第i個元素不存在 
        return ERROR;
    e = p->data;//取出第i個元素
    return OK; 
} 

8、插入

//單鏈表的插入操作
Status ListInsert_L(LinkList &L, int i, ElemType e){
    //在帶頭結點的單鏈表L中的第i個位置之前插入元素e
    LinkList p=L;
    int j=0;
    while(p && j<i-1){//尋找第i-1的位置 
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
        return ERROR;
    s = (LinkList)malloc(sizeof(Node));//建立一個新的結點s
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK; 
}

9、刪除

//刪除
Status ListDelete_L(LinkList &L, int i, ElemType &e){
    //在帶頭結點的單鏈表L中,刪除第i個元素,並由e返回其值
    LinkList p=L;//指向第一個節點
    LinkList q;
    int j = 0;//計數器
    while(p && j<i-1){//尋找第i個結點 
        p->next;
        j++;
    }
    while(!p || j>i-1)
        return ERROR;
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(p);
    return OK; 
}