1. 程式人生 > 其它 >Linux系統下搭建Gitlab伺服器

Linux系統下搭建Gitlab伺服器


離散儲存--連結串列

定義:

  1. n 個結點離散分配
  2. 彼此通過指標相連
  3. 每個結點只有一個前驅結點,每個結點只有一個後繼結點。
  4. 首結點沒有前驅結點,尾結點沒有後繼結點

專業術語:

  1. 首結點

    第一個有效結點

  2. 尾結點

    最後一個有效結點

  3. 頭結點

    第一個有效結點前的那個結點
    頭結點不存放有效資料
    加頭結點的目的主要是為了方便對連結串列的操作

  4. 頭指標

    指向頭結點的指標變數

  5. 尾指標

    指向尾結點的指標變數

如果希望通過一個函式來對連結串列進行處理,我們至少需要接收連結串列的哪些引數:

只需要一個引數:頭指標  
因為我們通過頭指標可以推算出連結串列的其他所有資訊。

構建一個結點:

    typedef struct Node
    {
        int data; //資料域
        struct Node * pNext; //指標域
    }* PNODE,NODE; //NODE等價於struct Node,  
    //PNODE等價於struct Node *

分類:

  1. 單鏈表
  2. 雙鏈表:

    每個結點有兩個指標域

  3. 迴圈連結串列:

    能通過任何一個結點找到其他所有結點

  4. 非迴圈連結串列

單鏈表演算法:

定義連結串列結點:
typedef int ElemType //不一定是int型,ElemType是需求型別
typedef struct LNode
{
    ElemType data;       //存放元素值
    struct LNose * next; //指向後繼結點
}LinkNode;               //單鏈表結點型別
初始化 InitList(&L)

void InitList(LinkNode *&L)
{
    L = (LinkNode *)malloc(sizeof(LinkNode));
    L->next s= NULL;
}
銷燬 DestroyList(&L)

void DestoryList(LinkNode *&L)
{
    LinkNode * pre = L,*p = L->next;
    while(p != NULL)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}
判空 ListEmpty(L)

bool ListEmpty(LinkNode * L)
{
    return(L->next = NULL);
}
求長度 ListLength(L)

int ListLength(LinkNode * L)
{
    LinkNode * p = L;
    int n=0;
    while(p->next != NULL)
    {
        n++;
        p = p->next;
    }
    return(n);
}

輸出 DispList(L)

void DispList(LinkNode * L)
{
    LinkNode *p = L->next;
    while(p != NULL)
    {
        printf("%d\n",p->data);
        p = p->next;
    }
    printf("\n");
}
按位求值 GetElem(L,i,&e)

bool GetElem(LinkNode *L,int i, ElemType &e)
{
    int j = 0;
    LinkNode *p = L;
    if (i <= 0) 
        return false;
    while(j < i && p != NULL)
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
        return false;
    else
    {   
        e = p->data;
        return true;
    }
}
按值查詢 LocateElem(L,e)

int LocateElem(LinkNode *L,ElemType e)
{
    int i = 1;
    LinkNode *p = L-> next;
    while(p != NULL && p->data != e)
    {
        p = p-> next;
        i++;
    }
    if(p == NULL)
        return 0;
    else
        return (i);
}
插入資料 ListInsert(&L,i,e)

bool ListInsert(LinkNode *&L,int i,ElemType e)
{
    int j = 0;
    LinkNode *p = L,*s;
    if(i <= 0) 
        return false;
    while(j < i-1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
        return false;
    else
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        s->data =e ;
        s->next = p->next;
        p->next = s;
        return true;
    }
}
刪除資料 ListDelete(&L,i,&e)

bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
    int j = 0;
    LinkNode *p = L,*q;
    if (i <= 0) 
        return false;
    while (j < i-1 && p != NULL )
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
        return false;
    else
    {
        q = p->next;
        if(q == NULL)
            return false;
        e = q->data;
        p->next = q->next;
        free(q);
        return true;
    }
}