程式設計總結(五)資料結構

2021-07-30 20:46:31 字數 3197 閱讀 3724

0x00 前言

本部分總結了幾種常見的資料結構的c++實現,預計會包括線性表,廣義表,棧,佇列,樹,二叉樹,圖等等。

0x01 線性表

1、順序表示

/*

順序表優點:隨機訪問

缺點:插入刪除需要移動大量的元素

*/templateclass array

array(int n)

void insert(int i, t x); //插入操作

void delete(int i);//刪除操作

void resize(int n);//重新分配大小

private:

int m_imaxsize=100;

t* m_array;

int m_ilength = 0;

};

2、鏈式表示
#include "stdafx.h"

#include

using

namespace

std;

/*鏈式表

優點:插入刪除方便

缺點:不能隨機訪問,要從頭結點開始遍歷,直到找到要訪問的元素

*/template

struct node

;template

class list

//插入操作,第i個元素後面插入

bool insert(int i, t* x)

//0<=iif (i>=m_ilength || i<0)

//建立節點

node* node = new node();

node->data = x;

node->pnext = nullptr;

//p指向第i個元素

node* p = m_plisthead;

int count = 0;

for (; p != nullptr, count < i; count++, p = p->pnext);

//保留i+1個元素的指標

node* pnext = p->pnext;

//插入node

p->pnext = node;

//恢復i+1個元素

node->pnext = pnext;

//鍊錶長度加一

m_ilength++;

}bool delete(int i)

node* pnext;

//刪除第乙個節點

if (i==0)

//p指向第i-1個元素

node* p = m_plisthead;

int count = 0;

for (; p != nullptr, count < i-1; count++, p = p->pnext);

pnext = p->pnext->pnext;

delete p->pnext;

p->pnext = pnext;

return

true;

}//得到第i個元素的值

t* getindexof(int i)

//p指向第i個元素

node* p = m_plisthead;

int count = 0;

for (; p != nullptr, count < i; count++, p = p->pnext);

return p->data;

}void print()

}//刪除操作

private:

node* m_plisthead = nullptr;//鍊錶的頭指標

int m_ilength = 0;

};int main()

//節點的資料結構,其他操作和單鏈表差不多

template

struct node

;

0x02 廣義表
/*

廣義表的資料結構

*///元素型別,分為原子型別和表型別

enum elemtype

;//廣義表節點,可能是原子節點,可能是表節點,這個可能是通過聯合體實現的

template

struct glnode ptr;

};};//鏈式廣義表

template

struct lglnode ptr;

};lglnode* pnext;//指向下乙個節點

};

關於廣義表的筆記

0x03 有約束的線性表

1、 棧

/*

陣列實現的棧

*/templateclass cstack

bool push(t t)

else

}t pop()

return t;

}int size()

bool empty()

private:

int m_itop = -1;

int m_isize = 0;

int m_imaxsize = 100;

t m_stack[100];//預設情況下,棧大小為100

};

筆記:

棧在作業系統中的應用-函式呼叫

序執行的棧具有以下特點:

對於有特定用途的幾個暫存器,簡要介紹如下:

函式呼叫過程:

- 初始情況下,bp暫存器的值為呼叫函式棧幀棧底的位址。

- 引數從後往前壓棧

- call fun;實際上2條指令,(1) 將當前的ip或者cs和ip壓入棧中。

(2) 轉移即進入函式體中。

- 將呼叫函式的棧幀棧底位址入棧,即將bp暫存器的值壓入棧中

- 建立新的棧幀,將被調函式的棧幀棧底位址(當前sp的值)放入bp

- 執行實際的函式體

- 函式返回,pop bp,此時bp中是呼叫函式的棧幀棧底位址,然後ret指令,本指令主要是彈出棧上面儲存的值(call指令儲存的值),賦值給cs和ip。實際上就是恢復call指令儲存的值。

2、佇列

資料結構(五)演算法總結

最壞情況與平均情況 最壞情況時間是一種保證,那就是執行時間不會再壞了。在應用中,這是一種最重要的需求,通常,除非特別指定,我們提到的執行時間都是最壞情況的執行時間。平均執行時間是所有情況中最有意義的,因為他是期望的執行時間。一般在沒有特殊說明的情況下,都是指最壞時間複雜度。演算法空間複雜度 演算法的...

資料結構(五)

陣列 陣列的抽象資料型別 adt array r pinitarray a,n,b1,bn destroyarray a value a,e,index assign a,e,index adt array 矩陣壓縮儲存 特殊矩陣 相同元素分布有一定規律的矩陣 稀疏矩陣 可以理解為零元素極多的矩陣 ...

資料結構知識點總結(五)

1 對於單鏈表 1 帶頭節點鍊錶判空條件 head next null 2 不帶頭節點鍊錶判空條件 head null 3 對於迴圈鍊錶判空條件 head next head 4 對於雙鏈表判空條件 head next head prior head2 1 順序棧判空條件 s.top s.base ...