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


  線性表的順序存儲結構的特點是邏輯關系上相鄰的兩個元素在物理位置上也相鄰,因此可以隨機存取表中任意元素。線性表鏈式存儲結構特點是用一組任意的存儲單元存儲數據元素,為了表示每個數據元素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; 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM