就是那個資料結構

2021-10-10 23:03:29 字數 4067 閱讀 4602

少年的肩應擔負起草長鶯飛和清風明月,女孩的眼應藏下星辰大海和萬丈光芒

晚安之後,有時候想你想得睡不著,有時候不想你睡不著

目錄

資料結構的基本概念

線性表順序表

單鏈表迴圈單鏈表

雙向迴圈鍊錶 棧

順序棧待寫。。。

有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是連通的,則這個無向圖...