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 ...