Linux系統下搭建Gitlab伺服器
阿新 • • 發佈:2022-05-20
title: 連結串列
categories: 資料結構學習
abbrlink: 54862
date: 2020-12-15 15:05:20
離散儲存--連結串列
定義:
- n 個結點離散分配
- 彼此通過指標相連
- 每個結點只有一個前驅結點,每個結點只有一個後繼結點。
- 首結點沒有前驅結點,尾結點沒有後繼結點
專業術語:
- 首結點
第一個有效結點
- 尾結點
最後一個有效結點
- 頭結點
第一個有效結點前的那個結點
頭結點不存放有效資料
加頭結點的目的主要是為了方便對連結串列的操作 - 頭指標
指向頭結點的指標變數
- 尾指標
指向尾結點的指標變數
如果希望通過一個函式來對連結串列進行處理,我們至少需要接收連結串列的哪些引數:
只需要一個引數:頭指標
因為我們通過頭指標可以推算出連結串列的其他所有資訊。
構建一個結點:
typedef struct Node
{
int data; //資料域
struct Node * pNext; //指標域
}* PNODE,NODE; //NODE等價於struct Node,
//PNODE等價於struct Node *
分類:
- 單鏈表
- 雙鏈表:
每個結點有兩個指標域
- 迴圈連結串列:
能通過任何一個結點找到其他所有結點
- 非迴圈連結串列
單鏈表演算法:
定義連結串列結點: 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;
}
}