数据结构中几种基本算法的实现

与算法设计有关的几种基础算法的实现汇总

注:代码中是在网上搜集,然后自己对其中部分内容进行修改后得到的

1.改进的归并排序(使用静态链表实现)

#include<iostream>
#include<random>
#include<time.h>
#include<iostream>
#define max 100000
using namespace std;
#define n 10000
int LINK[n];
void Merge(int *a, int p, int q, int r)
{
	int n1 = q - p + 1;       //左部分的的元素个数
	int n2 = r - q;           //右边部分
	int i, j, k;
	int *L = new int[n1 + 1];
	int *R = new int[n2 + 1];
	for (i = 0; i < n1; i++)
		L[i] = a[p + i];
	for (j = 0; j < n2; j++)
		R[j] = a[q + j + 1];
	L[n1] = max;
	R[n2] = max;
	
	for (i = 0, j = 0, k = p; k <= r; k++)
	{
		if (L[i] <= R[j])
			a[k] = L[i++];
		else
			a[k] = R[j++];
	}

	delete[]L;
	delete[]R;
}

void MergeSort(int *a, int l, int r)
{
	if (l < r)
	{
		int m = (l + r) / 2;
		MergeSort(a, l, m);
		MergeSort(a, m + 1, r);
		Merge(a, l, m, r);
	}
}


void quick_sort(int *a, int left, int right) //left和right为索引值
{
	int temp; //存储每次选定的基准数(从最左侧选基准数)
	int t;
	int initial = left;
	int end = right;
	temp = a[left];

	//***必须有这一部分***//
	if (left > right)  //因为在递归过程中有减1加1的情况,当其越界时,直接return,不返回任何值,即结束当前程序块
		return;

	while (left != right)  //此时左右index在移动中,若left==right,则跳出循环,将基数归位
	{
		while (a[right] >= temp && left < right)  //直到找到小于基准数的值为准
			right--;
		while (a[left] <= temp && left < right)  //找到大于基准值
			left++;
		if (left < right)  //交换左右两侧值,当left=right时,跳出外层while循环
		{
			t = a[right];
			a[right] = a[left];
			a[left] = t;
		}
	}
	a[initial] = a[left];
	a[left] = temp;      //将基准放到指定位置

	//递归处理归位后的基准数的左右两侧
	quick_sort(a, initial, left - 1);  //此时left=right
	quick_sort(a, left + 1, end);
}
void show(int*a, int len) {
	for (int i = 0; i < len; i++)
		cout << a[i] << " ";
}
void copy(int*a, int*b, int len) {
	for (int i = 0; i < len; i++)
		b[i] = a[i];
}
void Merge_(int& p, int q, int r, int* A)
{
	int i = q, j = r, k = 0;
	while (i != 0 && j != 0)
	{
		if (A[i] <= A[j])
		{
			LINK[k] = i;
			k = i;
			i = LINK[i];//找到下一个元素
		}
		else
		{
			LINK[k] = j;
			k = j;
			j = LINK[j];
		}
	}
	if (i == 0)//结束
		LINK[k] = j;
	else
		LINK[k] = i;
	p = LINK[0];//开始的地方
}
void InsertionSort(int low, int high, int& p, int*A)
{
	int a[n + 1], b[n + 1], k = 0;
	for (int i = low; i <= high; ++i)
		a[A[i]] = i;
	for (int i = low; i <= high; ++i)
		b[i] = A[i];
	sort(b + low, b + high + 1);//将b中元素排序
	for (int i = low; i <= high; ++i)
	{
		LINK[k] = a[b[i]];
		k = a[b[i]];
	}
	p = LINK[0];
}
void MergeSort_(int low, int high, int& p, int*A)
{
	if (high - low + 1 < 15)
		InsertionSort(low, high, p, A);
	else
	{
		int mid = (low + high) / 2;
		int q = 0, r = 0;
		MergeSort_(low, mid, q, A);
		MergeSort_(mid + 1, high, r, A);
		Merge_(p, q, r, A);
	}
}



int main()
{
	
    
	int* arr=new int[n];
	int* arr2 = new int[n];
	int* arr3= new int[n];
	
		
	for (int i = 0; i < n; i++)
	{
		LINK[i] = 0;
	}
	double dur;
	clock_t start, end;
	srand((unsigned int)time(NULL));
	for (int i = 0; i < n; i++)
	{
		arr[i] = rand() % n;
		;
	}
	copy(arr, arr2, n);
	for (int i = 1; i <= n; i++)
	{
		arr3[i] = rand() % n;

	}
	cout <<"数据个数"<<n<< endl;
	//快速排序
	start = clock();
	quick_sort(arr, 0, n - 1);
	end = clock();
	dur = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "快速排序:" << dur << endl;
	//归并排序
	start = clock();
	MergeSort(arr2, 0, n - 1);
	end = clock();
	dur = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "归并排序:" << dur << endl;
	//该进后的归并排序
	int M = n;
	int p = 0;
	start = clock();
	MergeSort_(1, M, p, arr3);
	end = clock();
	dur = (double)(end - start) / CLOCKS_PER_SEC;
	/*
	for (int i = p; i != 0; i = LINK[i])
		cout << arr3[i] << " ";
	*/
	cout << "改进的归并排序:" << dur << endl;
	cout << endl;
	
return 0;
}

2.Prim算法实现

#include<iostream>
#include<vector>
using namespace std;

#define MAX 100
#define MAXCOST 100

int graph[MAX][MAX];

struct edge {
	int x, y;
	int w;
	edge(int a, int b, int c) {
		x = a;
		y = b;
		w = c;
	}
};
vector<edge> E;//用于保存边
vector<edge> result;//保存最终的边
int flag(int * a,int n)
{
	int flag = 1;
	for (int i = 2; i <= n; i++)
	{
		if (a[i] == 0)
		{
			flag = 0;
			break;

		}
	}
	return flag;
	
}
edge min(int * a) {
	int size = E.size();
	for (int j = 0; j < size; j++) {
		if (a[E[j].x] && a[E[j].y]) {//两个端点都被使用过
			E[j].w = MAXCOST;
		}
	}
	edge min=E[0];
	int j=0;
	for (int i = 1; i < size; i++) {
		if (min.w >= E[i].w) {
			min = E[i];
			j = i;
		}
	}
	E[j].w = MAXCOST;//将其标记为已占用
	return min;
}

void Prim(int graph[][MAX], int n)//二维数组作为参数如何使用?
{
	int state[MAX];//存放状态
	state[1] = 1;
	for (int i = 2; i <= n; i++) {//初始化
		state[i] = 0;
		if(graph[1][i]!=MAXCOST)
		{
			edge e = edge(1, i, graph[1][i]);
			E.push_back(e);//加入边
		}
			
	}
	while (!flag(state,n))//迭代,让树生长
	{
		edge tep = min(state);
		result.push_back(tep);//将边导入数据
		int add;
		if (state[tep.x])
			add = tep.y;
		else
			add = tep.x;
		state[add] = 1;
		for (int i = 2; i <= n; i++) {//初始化
			if (graph[add][i] != MAXCOST)
			{
				edge e = edge(add, i, graph[add][i]);
				E.push_back(e);//加入边
			}

		}


	}
	
	
}
int main()
{
	int m, n, x, y, cost;
	cout << "请输入节点数目和边的数目:" << endl;
	cin >> m >> n;
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= m; j++)
			graph[i][j] = MAXCOST;
	
	cout << "请输入边" << endl;
	for (int k = 1; k <= n; k++)
	{
		cin >> x >> y >> cost;
		graph[x][y] = graph[y][x] = cost;//无向图
	}
	Prim(graph, m);
	cout << "最小生成树" << endl;
	int sum = 0;
	for (int i = 0; i < result.size(); i++)
	{
		cout << result[i].x << " " << result[i].y << " " << result[i].w << endl;
		sum += result[i].w;
	}
	cout<<"权值: "<<sum<<endl;
	return 0;
}

3.Kruskal算法实现

#include<iostream>
#include<algorithm>
using namespace std;
#define N 100
#define M 1000
int n, m, u, v, w;
int father[N];
struct Edge {
	int u, v, w;
}edge[M];
Edge result[M];
int cnt;
void addEdge(int u, int v, int w) {
	edge[cnt++] = Edge{ u,v,w };
}
bool cmp(Edge a, Edge b) {//由小到大排序
	return a.w < b.w;
}
int find(int x) {
	if (father[x] == x)
		return x;
	else
		return find(father[x]);
	//return father[x] == x ? x : father[x] = find(father[x]);//递归寻找父亲
}
int Kruskal() {
	int sum = 0;
	int c = 0;
	for (int i = 0; i <= n; i++) {//初始化
		father[i] = i;
	}
	sort(edge, edge + cnt, cmp);
	for (int i = 0; i < cnt; i++) {
		int u = edge[i].u;
		int v = edge[i].v;
		int w = edge[i].w;
		int fa = find(u);
		int fb = find(v);
		if (fa != fb) {
			sum += w;
			father[fa] = fb;
			result[c] = edge[i];
			c++;
			
		}
		if (c == n - 1) {
			break;
		}
	}
	if (c < n - 1) {
		//不连通
		return -1;
	}
	return sum;
}
int main(void) {
	cout << "请输入点和边的个数" << endl;
	cin >> n >> m;
	cnt = 0;
	cout << "请输入边的信息" << endl;
	while (m--) {
		cin >> u >> v >> w;
		addEdge(u, v, w);
	}
	cout << "最小生成树" << endl;
	
	
	int sum = Kruskal();
	for (int i = 0; i < n - 1; i++) {
		cout << result[i].v << " " << result[i].u << " " << result[i].w << endl;
	}
	cout << "权值: " << sum << endl;
	return 0;
}

4.Dijkstra算法实现

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100
#define MAXCOST 100000

int path[MAX];//保存前驱结点
int Graph[MAX][MAX];//保存图
int state[MAX];//保存结点状态
int dist[MAX];
void  Dijkstra(int G[][MAX], int v, int n)//输入源结点
{
	int u = v;
	for (int i = 0; i < n; i++)
	{
		state[i] = 0;
		dist[i] = G[v][i];
		if (dist[i] < MAXCOST)
		{
			path[i] = v;
		}
		else
		{
			path[i] = -1;
		}
		
	}
	
	state[v] = 1;
	for (int i = 0; i < n; i++)
	{
		int min = MAXCOST;
		for (int j = 0; j < n; j++)
		{
			if (state[j] == 0 && dist[j] < min)//dist中找出最小值
			{
				u = j;
				min = dist[j];
			}

		}
		state[u] = 1;
		for (int j = 0; j < n; j++)//更新
		{
			if (state[j] == 0 && dist[u] + G[u][j] < dist[j])
			{
				dist[j] = dist[u] + G[u][j];
				path[j] = u;
			}
		}

	}
}
void show( int v,int n) {
	for (int i = 0; i < n; i++) {
		if (i != v&&dist[i]<MAXCOST) {
			cout << v << "->" << i << "最短距离 " << dist[i] << endl;
			cout << "路径  " ;
			int j = i;
			while (path[j]!=-1)
			{
				cout << j << "<-";
				j = path[j];
				
			}
			cout << v;
			cout << endl << endl;;
		}
	}
}
int main() {
	int n, m;
	int x, y, cost;
	cout << "请输入结点数和边数" << endl;
	cin >> n >> m;
	for (int i = 0; i <= m; i++)
		for (int j = 0; j <= m; j++)
			Graph[i][j] = MAXCOST;//初始化
	cout << "请输入边" << endl;

	for (int k = 1; k <= m; k++)
	{
		cin >> x >> y >> cost;
		Graph[x][y]= cost;//有向图
	}
	Dijkstra(Graph, 0, n);
	show(0, n);
	
}

5.Floyd算法

#include <iostream>
#include <stack>
#define MAX 1000
#define MAX_VERTEX 20 
using namespace std;
struct Graph
{
	int *edges[MAX];
	int Vcount, Ecount;
};
void Init(Graph *graph) {

	cout << "请输入顶点数和边数" << endl;
	cin >> graph->Vcount >> graph->Ecount;
	for (int row = 1; row <= graph->Vcount; row++) {
		for (int col = 1; col <= graph->Vcount; col++) {
			graph->edges[row][col] = MAX;
		}
	}
	cout << "请输入边" << endl;
	int row, col, iWeight;
	for (int i = 1; i <= graph->Ecount; i++) {
		cin >> row >> col >> iWeight;
		graph->edges[row][col] = iWeight;
	}
}
void Floyd(Graph *graph, int **path) {

	for (int i = 1; i <= graph->Vcount; i++) {
		for (int j = 1; j <= graph->Vcount; j++) {
			path[i][j] = i;
		}
	}//初始化路径表

	for (int k = 1; k <= graph->Vcount; k++) {
		for (int i = 1; i <= graph->Vcount; i++) {
			for (int j = 1; j <= graph->Vcount; j++) {
				if (graph->edges[i][k] + graph->edges[k][j] < graph->edges[i][j]) {
					graph->edges[i][j] = graph->edges[i][k] + graph->edges[k][j];
					path[i][j] = path[k][j];
				}
			}
		}
	}

}
void Show(Graph *graph, int **path) {

	

	for (int i = 1; i <= graph->Vcount; i++) {
		for (int j = 1; j <= graph->Vcount; j++) {
			if (i != j) {
				cout << i << "->" << j << "\t";
				if (graph->edges[i][j] == MAX) {
					cout << "无路径" << "\t" << endl;
				}
				else {
					cout << graph->edges[i][j] << "\t";
					stack<int> stackVertices;// 利用栈来实现
					int k = j;
					do
					{
						k = path[i][k];
						stackVertices.push(k);
					} while (k != i);

					cout << stackVertices.top();
					stackVertices.pop();

				    int len = stackVertices.size();
					for (int i = 0; i < len; i++)
					{
						cout << " -> " << stackVertices.top();
						stackVertices.pop();
					}
					cout << " -> " << j << endl;
				}
			}
		}
	}
}

int main()
{
	int *path[MAX];
	for (int i = 0; i < MAX; i++) {
		path[i] = new int[MAX];
	}
	Graph graph;
	for (int i = 0; i < MAX; i++) {
		graph.edges[i] = new int[MAX];
	}
	Init(&graph);//初始化数据
	Floyd(&graph, path);
	Show(&graph, path);//展示数据
	system("pause");
	return 0;
}






6.动态规划求解多端图问题

#include<iostream>
using namespace std;
#define MAX 1000

void FGRAPH(int N, int k, int **P, int **cost, int** C, int *path)
{
	int i, j, t ;
	int m;
	int point;
	
	point = P[k][0];
	for (i = k - 1; i >= 1; i--)//阶段 向前地推
	{
		j = 0;//i阶段的状态
		while (P[i][j] != 0)//保存点的编号
		{
			m = 0;//i+1阶段的状态
			cost[i][j] = MAX; 
			if (C[P[i][j]][point] == MAX) //C是用于计算距离
			{
				while (P[i + 1][m] != 0)
				{
					if (C[P[i][j]][P[i + 1][m]] != MAX)//两个点之间有路径
					{
						if (cost[i][j] > (cost[i + 1][m] + C[P[i][j]][P[i + 1][m]]))
						{
							cost[i][j] = cost[i + 1][m] + C[P[i][j]][P[i + 1][m]];//取最小值
							path[P[i][j]] = P[i + 1][m];//替换选择,保存路径
							
						}
					}
					m++;
				}
			}
			else//初始化
			{
				while (P[i + 1][m] != 0)
				{
					if (cost[i][j] > (cost[i + 1][m] + C[P[i][j]][P[i + 1][m]]))
					{
						cost[i][j] = cost[i + 1][m] + C[P[i][j]][P[i + 1][m]];
						path[P[i][j]] = P[i + 1][m];
						
					}
					m++;
				}
			}
			j++;
		}
	}
	cout << "符合条件的点为:" << endl;
	t = 0;
	path[t] = 1;
	cout << path[t] << " ";
	t = path[t];
	while (t < N)
	{
		cout << path[t] << " ";
		t = path[t];
	}
	cout << endl << "最短距离为:";
	cout << cost[i + 1][0] << endl;
}
void Init(int N, int k, int** P, int **C)//k 表示有几个阶段 初始化多段图 C存储多段图信息
{
	int X;
	int i, j;

	cout << "输入边的信息:" << endl;
	cin >> i;
	while (i != 0)
	{
		cin >> j;
		cin >> C[i][j];
		cin >> i;
	}
	cout << "输入每个阶段的信息:" << endl;
	for (i = 1; i <= k; i++)// 1到k
	{
		cout << "输入第" << i << "阶段的状态的点数:";
		cin >> X;
		cout << "点的信息分别为:";
		for (j = 0; j < X; j++)
		{
			cin >> P[i][j];//保存点的状态
		}
	}
}
int main(int argc, char *argv[])
{
	int N, k;
	int i, j;
	int **C, **P, **cost;//C:边的长度,P;每个阶段的状态;cost:记录每个阶段的状态中的点到终点的距离
	int *path;//输出点
	cout << "输入点的个数:";
	cin >> N;
	cout << "输入阶段数:";
	cin >> k;
	C = new int*[N + 1];
	//初始化
	for (i = 0; i < N + 1; i++)
	{
		
		C[i] = new int[N + 1];
		for (j = 0; j < N + 1; j++)
		{
			C[i][j] = MAX;
		}
	}
	P = new int*[N + 1];
	for (i = 0; i < N + 1; i++)
	{
		P[i] = new int[N + 1];
		memset(P[i], 0, sizeof(int)*(N + 1));//初始化
	}
	cost = new int *[N + 1];
	for (i = 0; i < N + 1; i++)
	{
		cost[i] = new int[N + 1];
		for (j = 0; j < N + 1; j++)
		{
			cost[i][j] = 0;
		}
	}
	path = new int[N + 1];
	memset(path, 0, sizeof(int)*(k + 1));
	Init(N, k, P, C);
	
	//删除
	FGRAPH(N, k, P, cost, C, path);
	delete[]path;
	for (i = 0; i < N + 1; i++)
	{
		delete[]C[i];
	}
	delete[]C;
	for (i = 0; i < N + 1; i++)
	{
		delete[]P[i];
	}
	delete[]P;
	for (i = 0; i < N + 1; i++)
	{
		delete[]cost[i];
	}
	delete[]cost;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 范例1-4 显示杨辉三角 7 ∷相关函数:c函数 8 1.1.5 魔方阵 9 范例1-5 魔方阵 9 1.1.6 三维数组的表示 14 范例1-6 三维数组的表示 14 ∷相关函数:InitArray函数 1.1.7 多项式的数组表示 17 范例1-7 多项式数组的表示 17 1.1.8 查找矩阵的马鞍点 19 范例1-8 查找矩阵的马鞍点 19 ∷相关函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相关函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相关函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ∷相关函数:store函数 1.1.13 字符串长度的计算 28 范例1-13 字符串长度的计算 28 ∷相关函数:strlen函数 1.1.14 字符串的复制 29 范例1-14 字符串的复制 29 ∷相关函数:strcpy函数 1.1.15 字符串的替换 31 范例1-15 字符串的替换 31 ∷相关函数:strrep函数 1.1.16 字符串的删除 33 范例1-16 字符串的删除 33 ∷相关函数:strdel函数 1.1.17 字符串的比较 35 范例1-17 字符串的比较 35 ∷相关函数:strcmp函数 1.1.18 字符串的抽取 36 范例1-18 字符串的抽取 36 ∷相关函数:substr函数 1.1.19 字符串的分割 38 范例1-19 字符串的分割 38 ∷相关函数:partition函数 1.1.20 字符串的插入 40 范例1-20 字符串的插入 40 ∷相关函数:insert函数 1.1.21 字符串的匹配 42 范例1-21 字符串的匹配 42 ∷相关函数:nfind函数 1.1.22 字符串的合并 43 范例1-22 字符串的合并 43 ∷相关函数:catstr函数 1.1.23 文本编辑 45 范例1-23 文本编辑 45 ∷相关函数:StrAssign函数 1.2 栈和队列 54 1.2.1 用数组仿真堆栈 54 范例1-24 用数组仿真堆栈 54 ∷相关函数:push函数 pop函数 1.2.2 用链表仿真堆栈 57 范例1-25 用链表仿真堆栈 57 ∷相关函数:push函数 pop函数 1.2.3 顺序栈公用 59 范例1-26 顺序栈公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:push函数 pop函数 1.2.6 循环队列 66 范例1-29 循环队列 66 ∷相关函数:EnQueue函数 DeQueue函数 1.2.7 链队列的入队、出队 69 范例1-30 链队列入队、出队 69 ∷相关函数:push函数 pop函数 1.2.8 舞伴问题 71 范例1-31 舞伴问题 71 ∷相关函数:EnQueue函数 DeQueue函数 DancePartner函数 1.3 链表 75 1.3.1 头插法建立单链表 75 范例1-32 头插法建立单链表 75 ∷相关函数:createlist函数 1.3.2 限制链表长度建立单链表 77 范例1-33 限制链表长度建立长单链表 77 ∷相关函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相关函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找单链表 80 ∷相关函数:getnode函数 1.3.5 按值查找单链表 82 范例1-36 按值查找单链表 82 ∷相关函数:locatenode函数 1.3.6 链表的插入 84 范例1-37 链表的插入 84 ∷相关函数:insertnode函数 1.3.7 链表的删除 86 范例1-38 链表的删除 86 ∷相关函数:deletelist函数 1.3.8 归并两个单链表 88 范例1-39 归并两个单链表 88 ∷相关函数:concatenate函数 1.3.9 动态堆栈 90 范例1-40 动态堆栈 90 ∷相关函数:push函数 Pop函数 1.3.10 动态队列 93 范例1-41 动态队列 93 ∷相关函数:Enqueue函数 1.3.11 初始化单循环链表 95 范例1-42 初始化单循环链表 95 ∷相关函数:ListLength_CL函数 1.3.12 查询元素的前驱和后继 98 范例1-43 查询元素的前驱和后继 98 ∷相关函数:PriorElem_CL函数 NextElem_CL函数 1.3.13 单循环链表元素的删除 101 范例1-44 单循环链表元素的删除 101 ∷相关函数:ListDelete_CL函数 1.3.14 单循环链表的清除和销毁 107 范例1-45 单循环链表的清除和销毁 107 ∷相关函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相关函数:MergeList_CL函数 1.3.16 正序输出双向链表 113 范例1-47 正序输出双向链表 113 ∷相关函数:ListInsert函数 ListTraverse函数 1.3.17 逆向输出双向链表 116 范例1-48 三角矩阵建立 116 ∷相关函数:ListTraverseBack函数 1.3.18 删除双向链表的节点 121 范例1-49 删除双向链表的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 判断双向链表是否为空 126 ∷相关函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相关函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷相关函数:erase函数 1.4 树和二叉树 141 1.4.1 获得二叉树的深度和根(顺序结构) 141 范例1-55 获得二叉树的深度和根 141 ∷相关函数:BiTreeDepth函数 Root函数 1.4.2 获得二叉树的深度和根(链表结构) 144 范例1-56 获得二叉树的深度和根 144 ∷相关函数:BiTreeDepth函数 Root函数 1.4.3 树的插入(顺序结构) 147 范例1-57 树的插入 147 ∷相关函数:InsertChild函数 1.4.4 节点的修改(顺序结构) 150 范例1-58 节点的修改 150 ∷相关函数:Assign函数 1.4.5 节点的修改(链式结构) 154 范例1-59 节点的修改 154 ∷相关函数:Assign函数 1.4.6 双亲、孩子和兄弟节点的查询(顺序结构) 158 范例1-60 双亲、孩子和兄弟节点的查询 158 ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 序遍历二叉树(顺序结构) 169 范例1-62 序遍历二叉树 169 ∷相关函数:InOrderTraverse函数 1.4.9 序遍历二叉树(链式结构) 171 范例1-63 序遍历二叉树 171 ∷相关函数:InOrderTraverse函数 1.4.10 序非递归遍历二叉树(链式结构)(1) 174 范例1-64 序非递归遍历二叉树 174 ∷相关函数:InOrderTraverse函数 1.4.11 序非递归遍历二叉树(链式结构)(2) 177 范例1-65 序非递归遍历二叉树 177 ∷相关函数:InOrderTraverse2函数 1.4.12 后序遍历二叉树(顺序结构) 180 范例1-66 后序遍历二叉树 180 ∷相关函数:PostOrderTraverse函数 1.4.13 后序遍历二叉树(链式结构) 183 范例1-67 后序遍历二叉树 183 ∷相关函数:PostOrderTraverse函数 1.4.14 层次遍历二叉树(顺序结构) 186 范例1-68 层次遍历二叉树 186 ∷相关函数:LevelOrderTraverse函数 1.4.15 层次遍历二叉树(链式结构) 188 范例1-68 层次遍历二叉树 188 ∷相关函数:LevelOrderTraverse函数 1.4.16 树的合并 191 范例1-70 树的合并 191 ∷相关函数:Find函数 Union函数 1.4.17 树的二叉链表存储的基本操作 193 范例1-71 树的二叉链表存储的基本操作 193 ∷相关函数:LevelOrderTraverse函数 1.4.18 二叉树的三叉链表存储的基本操作 201 范例1-72 二叉树的三叉链表存储表示 201 ∷相关函数:CreateBiTree函数 1.4.19 二叉树的二叉线索存储的基本操作 212 范例1-73 二叉树的二叉线索存储 212 ∷相关函数:CreateBiThrTree函数 1.4.20 树的双亲表存储的基本操作 215 范例1-74 树的双亲表存储的基本操作 215 ∷相关函数:CreateTree函数 1.4.21 哈夫曼编码(1) 223 范例1-75 哈夫曼编码(1) 223 ∷相关函数:HuffmanCoding函数 1.4.22 哈夫曼编码(2) 226 范例1-76 哈夫曼编码(2) 226 ∷相关函数:HuffmanCoding函数 1.5 排序 229 1.5.1 直接插入排序 229 范例1-77 直接插入排序 229 ∷相关函数:InsertSort函数 1.5.2 折半插入排序(顺序结构) 231 范例1-78 折半插入排序(顺序结构) 231 ∷相关函数:BInsertSort函数 1.5.3 2—路插入排序(顺序结构) 233 范例1-79 2—路插入排序(顺序结构) 233 ∷相关函数:P2_InsertSort函数 1.5.4 折半插入排序(链式结构) 235 范例1-80 折半插入排序(链式结构) 235 ∷相关函数:Arrange函数 1.5.5 2—路插入排序(链式结构) 238 范例1-81 2—路插入排序(链式结构) 238 ∷相关函数:Rearrange函数 1.5.6 希尔排序 241 范例1-82 希尔排序 241 ∷相关函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相关函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相关函数:QSort函数 1.5.9 一趟快速排序的改进算法 248 范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:sort函数 1.5.12 树型选择排序 254 范例1-88 树型选择排序 254 ∷相关函数:TreeSort函数 1.5.13 堆排序 256 范例1-89 堆排序 256 ∷相关函数:HeapSort函数 1.5.14 归并排序 258 范例1-90 归并排序 258 ∷相关函数:MergeSort函数 1.5.15 多路平衡归并排序 260 范例1-91 多路平衡归并排序 260 ∷相关函数:K_Merge函数 1.5.16 置换—选择排序 265 范例1-92 置换—选择排序 265 ∷相关函数:Replace_Selection函数 1.5.17 文件的归并 269 范例1-93 文件的归并 269 ∷相关函数:K_Merge函数 1.6 查找 272 1.6.1 顺序表的查找 273 范例1-94 顺序表的查找 273 ∷相关函数:Search_Seq函数 1.6.2 静态树表的查找 276 范例1-95 静态树表的查找 276 ∷相关函数:Search_SOSTree函数 1.6.3 二叉排序树的基本操作 280 范例1-96 二叉排序树的基本操作 280 ∷相关函数:InsertBST函数 1.6.4 平衡二叉树的基本操作 285 范例1-97 平衡二叉树的基本操作 285 ∷相关函数:SearchBST函数 1.6.5 B树的基本操作 290 范例1-98 B树的基本操作 290 ∷相关函数:SearchBTree函数 1.6.6 按关键字符串的遍历双链键树 295 范例1-99 按关键字符串遍历双链键树 295 ∷相关函数:SearchDLTree函数 1.6.7 按关键字符串的遍历Trie树 301 范例1-100 按关键字符串遍历Trie树 301 ∷相关函数:SearchTrie函数 1.6.8 哈希表的基本操作 306 范例1-101 哈希表的基本操作 306 ∷相关函数:SearchHash函数 1.7 图 311 1.7.1 图的邻接矩阵存储表示 311 范例1-102 图的邻接矩阵存储表示 ∷相关函数:CreateFAG函数 CreateDG函数 1.7.2 图的邻接表存储表示 324 范例1-103 图的邻接表存储表示 324 ∷相关函数:CreateFAG函数 1.7.3 有向图的十字链表存储表示 335 范例1-104 有向图的十字链表存储表示 335 ∷相关函数:CreateDG函数 1.7.4 无向图的邻接多重表存储表示 344 范例1-105 无向图的邻接多重表存储表示 344 ∷相关函数:CreateGraph函数 1.7.5 最小生成树 355 范例1-106 最小生成树 355 ∷相关函数:MiniSpanTree_PRIM函数 1.7.6 关节点和重连通分量 359 范例1-107 关节点和重连通分量 359 ∷相关函数:FindArticul函数 1.7.7 拓扑排序 366 范例1-108 拓扑排序 366 ∷相关函数:TopologicalSort函数 1.7.8 关键路径 374 范例1-109 关键路径 374 ∷相关函数:CriticalPath函数 1.7.9 最短路径 383 范例1-110 最短路径 383 ∷相关函数:ShortestPath_DIJ函数 1.7.10 每一对顶点之间的最短路径 387 范例1-111 每一对顶点之间的最短路径 387 ∷相关函数:ShortestPath_FLOYD函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值