少年的肩應擔負起草長鶯飛和清風明月,女孩的眼應藏下星辰大海和萬丈光芒
晚安之後,有時候想你想得睡不著,有時候不想你睡不著
目錄
資料結構的基本概念
線性表順序表
單鏈表迴圈單鏈表
雙向迴圈鍊錶 棧
順序棧待寫。。。
有n個元素的順序表,第i個位置上插入乙個元素需要移動表中n-i+1個資料元素,刪除第i個文字上的資料元素需要移動表中n-i個元素
1.資料集合的描述
typedef struct
seqlist;
2.初始化
void listinitate(seqlist *l)
3.求當前資料元素個數
int listlength(seqlist *l)
4.插入資料元素
int listinsert(seqlist *l,int i,datatype x)
}
5.刪除資料元素
int listdelete(sqlist *l,int i,datatype *x)
}
6.取出資料元素
int listget(seqlist l,int i,datatype *x)
向資料表中插入資料是,平均移動次數為n/2
刪除乙個元素平均移動次數為n-1/2
插入與刪除操作時間複雜度均為o(n),其餘均為o(1)
1.單鏈表結點
typedef struct node
slnode;
2.初始化
void listinitiate(slnode **head)
3.求當前資料元素的個數
int listlength(slnode *head)
return size;
}
4.在第i個資料元素前插入資料元素x
int listinsert(slnode *head,int i,datatype x)
if(j+1 !=i) //判斷i是否合法
return 0;
q=(slnode *)malloc(sizeof(slnode));
q->data=x;
q->next=p->next;
p->next=q;
return 0
}
5.刪除i位置的元素
int listdelete(slnode *head,int i,datatype *x)
6.取資料元素,過程同5
7.銷毀單鏈表,while迴圈,呼叫free()即可;
初始化時 *head->next=head
遍歷時 *p->next=*head結束遍歷
結構體定義中除了datatype data;還有前後指標struct node *next;struct node *prior;
初始化時head=(node *)malloc(sizeof(node));head->next=head;head->prior=head;
插入和刪除就直接畫出圖形照著寫就是
後進先出是lifo,先進先出是fifo
儲存結構用陣列
typedef struct
seqstack;
初始化就是將棧頂元素位置即s->top設定為0,注意此處為0,王道是-1
判斷是否非空就是判斷top是否小於等於0,是就是空,反之不空
入棧就是將資料元素存入資料順序棧中,棧頂指標加一
s->stack[s->top]=x;
s->top++;
//或者合併寫:
s->stack[s->top++]=x;
出棧就是將棧頂指標減一
取棧頂元素就是陣列取值操作,這裡需要注意,top代表的是資料元素的個數,取值時要記得減一
*x=s->stack[s->top-1];
鏈式堆疊的插入和刪除操作都在煉表表頭進行的,且是帶有頭結點的鍊錶
棧頂元素就是head->next所指向的元素
字尾表示式的求法
x1表示當前棧頂元素,x2表示當前掃瞄到的元素
比較優先順序:
x1>x2:x1出棧並加入字尾表示式,將x1變為新的棧頂元素,繼續比較
x1x1=x2且x1=="(",x2==")":將x1出棧繼續讀取下乙個元素
x1=x2="#":演算法結束
優先順序的規則:
不同級別:"(" >乘除》加減》 ")"
同一級別:棧頂》掃瞄到的元素
串的下標是從0開始的,比如插入或者刪除等操作中從第i個字元開始,i
字元陣列的下標
字串比較比的是ascii
設主串長為n子串長為m,最好情況下時間複雜度為o(m),最壞情況下時間複雜度為o(mn)
int bfindex(dstring s,int start,dstring t)//查詢成功則返回子串在主串中的位置
else
}if(t==t->length)
pos=s=t->length;
else
pos=-1;
return pos;
}
計算next[j]
void getnext(dstring t,int next)
else if(k==0)
else
k=next[k];
}}
無向圖中有n個頂點e條邊,則對應鄰接表中有n個表頭結點和2e個表結點
有向圖中有n個頂點e條邊,則對應鄰接表中有n個表頭結點和e個表結點
連通圖是指無向圖中任意一對頂點都存在路徑。
設某連通圖中有n個頂點則該連通圖中至少n-1條邊
強連通圖是指有向圖中任意一對頂點都存在路徑
設某強連通圖中有n個頂點則該強連通圖中至少n條邊
m階b_樹就是m階平衡m叉樹
1.樹中每個結點至多有m個孩子結點,除根節點之外,其他結點至少有 m/2(向上取整) 個孩子結點
2.每個節點中至多有m-1個關鍵字,非根結點至少m/2(向上取整) -1個關鍵字,根結點可以有乙個關鍵字
2.若根節點不是葉子結點則根節點至少有兩個孩子結點
3.所有葉子結點都在同一層上
比如3階b_樹,每個結點最多3個孩子結點,每個結點中最多個3-1=2關鍵字,除根節點為至少3/2=1個結點
每個節點中至多有m-1個關鍵字
情況1:待插結點中關鍵字滿足n
操作:直接插入
情況2:待插結點中有m-1個關鍵字
操作:**結點:以中間關鍵字為界,把結點分成兩個結點並把中間元素的關鍵字向上插入到雙親結點上,若雙親結點已滿,則繼續**雙親結點
每個節點中至多有m-1個關鍵字,非根結點至少 m/2-1 個關鍵字
一、刪除葉子結點
情況1:待刪結點的關鍵字個數n>=m/2
操作:直接刪除
情況2:待刪結點關鍵字個數n=m/2-1
,並且左兄弟或右兄弟關鍵字大於m/2-1
操作:問左兄弟或右兄弟借
以左兄弟為例:將待刪結點的左兄弟中最大的關鍵字移動到雙親中,同時把雙親中大於上移關鍵字的關鍵字下移到待刪元素的結點中,將待刪元素給刪除
情況3:待刪結點關鍵字個數n=m/2-1
,並且左兄弟或右兄弟關鍵字等於m/2-1
操作:合併結點
把待刪結點與其左(右)兄弟結點以及雙親結點上分割二者的元素合併成乙個結點,然後再把待刪元素刪除
二、刪除非葉子結點
操作:找、複製、刪
1.找到右指標所指的子樹中最小的關鍵字
2.將最小的關鍵字的值複製到待刪元素上
3.以右指標所指結點為根節點,刪除關鍵字等於最小關鍵字的資料元素
幾個資料結構問題
題目1描述 給定n個數字,數字是 1,c 的數字,給定m個區間詢問 n 300000,c 300000,m 100000 問是否存在 r l 1 2的數字 分析 我們先來看這樣的兩個例子 奇數長度的區間 這裡我們將區間內的數字排了個序 注意到沒,如果存在那樣乙個數,那麼至少是比這兩個區間大的區間滑動...
資料結構實驗 連通分量個數
在無向圖中,如果從頂點vi到頂點vj有路徑,則稱vi和vj連通。如果圖中任意兩個頂點之間都連通,則稱該圖為連通圖,否則,稱該圖為非連通圖,則其中的極大連通子圖稱為連通分量,這裡所謂的極大是指子圖中包含的頂點個數極大。例如 乙個無向圖有5個頂點,1 3 5是連通的,2是連通的,4是連通的,則這個無向圖...
資料結構實驗 連通分量個數
在無向圖中,如果從頂點vi到頂點vj有路徑,則稱vi和vj連通。如果圖中任意兩個頂點之間都連通,則稱該圖為連通圖,否則,稱該圖為非連通圖,則其中的極大連通子圖稱為連通分量,這裡所謂的極大是指子圖中包含的頂點個數極大。例如 乙個無向圖有5個頂點,1 3 5是連通的,2是連通的,4是連通的,則這個無向圖...