1. 程式人生 > 實用技巧 >02、線性表

02、線性表

儲存表示:

  線性表的順序儲存表示:

  線性表的鏈式表示:

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

雙向連結串列:

頭插法(前插法):插入連結串列的頭部(頭節點之後)來建立連結串列。
尾插法(尾插法):插入到連結串列的尾部來建立連結串列。

單鏈表的轉置(反轉):

線性表的合併:
有序表的合併:

廣義表:
多重連結串列:

矩陣的多重連結串列:

注意:c語言實現的某些程式,使用前必須初始化,不初始化會有野指標,程式會奔潰。

測試:注意邊界問題,邊界的值能否取到。

順序儲存的程式碼:

#include <stdio.h>
#include 
<malloc.h> #define MAXSIZE 100 //順序表操作注意下標的合法範圍,越界與操作有沒有全部包含,注意邊界情況。 typedef int ElemType; typedef struct{ //順序表 ElemType *elem; int length;//當前表中元素長度 }SqList; int InitList(SqList &l){ //順序表的初始化 l.elem = NULL; l.elem = (ElemType*) malloc (MAXSIZE * sizeof(ElemType));
if(l.elem == NULL) return 0; l.length = -1; return 1; } int ListAdd(SqList &l,ElemType x){ //新增元素 if(l.length >= MAXSIZE) return -1; l.elem[++l.length] = x; return 1; } int ListInsert(SqList &l,ElemType x,int i){ //將元素插入在第i號位置(0 <= i <= l.length+1) if(l.length >= MAXSIZE) return
-1; if(i > l.length+1 || i < 0)return -1; for(int j = l.length;j >= i;j--){ l.elem[j+1] = l.elem[j]; } l.elem[i] = x; l.length++; return 1; } int GetElem(SqList &l,int i,ElemType &e){ //取第i號位置的元素的值 if(i > l.length || i < 0) return -1; e = l.elem[i]; return 1; } int ListDelete(SqList &l,int i){ //刪除第i號位置的元素(0 <= i <= l.length) if(i > l.length || i < 0) return -1; for(int j = i;j<l.length;j++) l.elem[j] = l.elem[j+1]; l.length--; return 1; } int LocateList(SqList &l,ElemType x){ //查詢表中是否含有元素x,返回下標 int i; for(i = 0;i <= l.length;i++) if(l.elem[i] == x) return i; return -1; } void PrintList(SqList &l){ for(int i = 0;i <= l.length;i++) printf("%d ",l.elem[i]); printf("\n"); } int main(){ SqList l; int i = InitList(l); ListAdd(l,0); ListAdd(l,1); ListAdd(l,2); //ListAdd(l,3); ListInsert(l,-1,1); i = LocateList(l,0); i = GetElem(l,4,i); printf("%d\n",i); PrintList(l); ListDelete(l,3); PrintList(l); return 0; }
View Code

鏈式儲存:

#include <stdio.h>
#include <malloc.h>
//線性表的鏈式儲存結構

typedef int ElemType;
typedef struct Node{
    ElemType data;
    Node* next;
}List,*Lp;

typedef struct DuNode{
    //雙向連結串列的儲存結構
    ElemType data;
    DuNode* prior;  //直接前驅
    DuNode* next;   //直接後繼
}DuList,*Dup;

int ListInit(Lp &l){
    //初始化,頭節點沒有儲存資料,操作方便
    l = (Lp)malloc(sizeof(List));
    if(l == NULL) return -1;
    l->next = NULL;
    return  1;
}

int ListAdd(Lp &l,ElemType x){
    //
    Lp p = l;
    while(p->next != NULL){
        p = p->next;
    }
    Lp t = (Lp)malloc(sizeof(List));
    if(t == NULL) return -1;
    t->data = x;
    t->next = NULL;
    p->next = t;
    return 1;
}
int ListAdd2(Lp &l,ElemType x){
    Lp t = (Lp)malloc(sizeof(List));
    if(t == NULL) return -1;
    t->data = x;
    t->next = l->next;
    l->next = t;
    return 1;
}

int ListLocate(Lp &l,ElemType x){
    //查 返回0代表未找到
    int i =  0;
    Lp t = l->next;
    while(t != NULL){
        i++;
        if(t->data == x){
            return i;
        }
        t = t->next;
    }
    return 0;
}

int  ListGet(Lp &l,int i,ElemType &e){
    //取值
    Lp p = l->next;
    for(int m = 1;m < i && p;m++ ){
        p = p->next;
    }
    if(p == NULL) return -1;
    e  = p->data;
    return 1;
}

int ListInsert(Lp &l,ElemType x,int i){
    //插入的合法下標(1 <= i <= n+1)頭指標永遠不能變
    Lp p = l;
    if(i < 1) return -1;
    int m = 1;
    while(p->next != NULL && m != i){
        p = p->next;
        m++;
    }
    if(m == i){
        Lp t = (Lp)malloc(sizeof(List));
        if(t == NULL) return -1;
        t->data = x;
        t->next = p->next;
        p->next = t;
        return 1;
    }
    return -1;
}

int ListDelete(Lp &l,int i){
    //刪除的合法下標(1 <= n )注意釋放空間
    Lp p = l;
    if(i < 1) return -1;
    for(int m = 1;m < i && p->next;m++){
        p = p->next;
    }
    if(p->next == NULL) return -1;
    Lp q = p->next;
    p->next = q->next;
    free(q);
    return 1;
}

void ListDown(Lp &l){
    //單鏈表的(反轉)轉置
    Lp p = l->next;
    l->next = NULL;
    while(p){
        Lp q = p;
        p = p->next;
        q->next = l->next;
        l->next = q;
    }
}

void ListPrint(Lp &l){
    Lp p = l->next;
    while(p){
        int i = p->data;
        printf("%d  ",i);
        p = p->next;
    }
    printf("\n");
}

int main(){
    Lp a;
    int i,m;
    ListInit(a);
    ListAdd(a,1);
    ListPrint(a);
    ListAdd(a,2);
    ListPrint(a);
    ListAdd2(a,3);
    ListAdd2(a,4);
    ListPrint(a);
    ListInsert(a,5,1);
    ListPrint(a);
    ListDelete(a,6);
    ListPrint(a);
    return 0;
}
View Code

注意:程式碼經過簡單測試,並不保證程式碼完全無誤。

程式碼中有可能含有c++的語法。

有些內容沒有補全(大多數為書中的定義),請自行查詢相關內容。

上一篇:01、緒論、複雜度

下一篇:持續更新中