两点路径

#include<iostream>
#include<stdlib.h>
using namespace std;
#define VEX_MAXNUM 20
#define STACK_H_INCLUDED
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10   //存储空间分配增量

typedef struct SqStack {
	int* base;
	int* top;
	int stacksize;
}SqStack;

void CreateStack(SqStack* S) {
	S->base = (int*)malloc(STACK_INIT_SIZE * sizeof(int*));
	if (!S->base) {
		cout << "存储空间分配失败!" << endl;
		exit(-1);
	}
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;
}

void DestroySqStack(SqStack* S) {
	free(S->base);
	S->base = S->top = NULL;
	S->stacksize = 0;
}

void DisplaySqStack(SqStack* S) {
	int* p;
	if (S->top == S->base) {
		cout << "栈空!" << endl;
		exit(-1);
	}
	p = S->base;
	while (p < S->top-1)
		cout << *p++<<"->";
	cout << *p++;
}

void Push(SqStack* S, int data) {
	if (S->top - S->base == S->stacksize) {
		int* newbase = (int*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(int));
		if (!newbase) {
			cout << "存储空间分配失败!" << endl;
			exit(-1);
		}
		S->base = newbase;
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*S->top++ = data;
}

void Pop(SqStack* S) {
	if (S->top == S->base) {
		cout << "栈空!" << endl;
		exit(-1);
	}
	S->top--;
}

int GetTop(SqStack* S) {
	if (S->top == S->base) {
		cout << "栈空!" << endl;
		exit(-1);
	}
	return *(S->top - 1);
}

int StackLength(SqStack* S) {
	return S->top - S->base;
}

int visited[VEX_MAXNUM];

typedef struct EdgeNode {
	int vex_index;
	struct EdgeNode* next;
}EdgeNode;

typedef struct VexNode {
	int data;
	EdgeNode* edge;
}VexNode,AdjList[VEX_MAXNUM];

typedef struct Graph{
	AdjList list;
	int vexnum, edgenum;
}Graph;

int LocateIndex(Graph* G, int v) {
	int i = 0, j = G->vexnum - 1, mid;
	while (i <= j) {
		mid = (i + j) / 2;
		if (G->list[mid].data == v)
			break;
		else if (v > G->list[mid].data)
			i = mid + 1;
		else
			j = mid - 1;
	}

	if (i > j) {
		cout << "顶点不存在!" << endl;
		exit(-1);
	}

	return mid;
}

void CreateGraph(Graph* G) {
	cout << "请输入图的顶点数和边数:" << endl;
	cin >> G->vexnum >> G->edgenum;
	
	cout << "请输入顶点:" << endl;
	for (int i = 0; i < G->vexnum; i++) {
		cin >> G->list[i].data;
		G->list[i].edge = NULL;
	}

	cout << "请输入边:" << endl;
	for (int k = 0; k < G->edgenum; k++) {
		int v1, v2,i,j;
		EdgeNode* p, * q;
		cin >> v1 >> v2;
		i = LocateIndex(G, v1);
		j = LocateIndex(G, v2);
		
		p = (EdgeNode*)malloc(sizeof(EdgeNode));
		p->vex_index = j;
		p->next = NULL;
		q = G->list[i].edge;
		if (!q)
			G->list[i].edge = p;
		else {
			while (q->next)
				q = q->next;
			q->next = p;
		}

		p = (EdgeNode*)malloc(sizeof(EdgeNode));
		p->vex_index = i;
		p->next = NULL;
		q = G->list[j].edge;
		if (!q)
			G->list[j].edge = p;
		else {
			while (q->next)
				q = q->next;
			q->next = p;
		}
	}
}

void DestroyGraph(Graph* G) {
	VexNode* p;
	EdgeNode* q;
	for (int i = 0; i < G->vexnum; i++) {
		p = &G->list[i];
		while(p->edge) {
			q = p->edge;
			p->edge = q->next;
			free(q);
		}
	}
}

void DFSALLPath(Graph* G, int index1, int index2,SqStack*S) {
	EdgeNode* p;
	visited[index1] = 1;
	Push(S, index1);
	if (index1 == index2) {
		DisplaySqStack(S);
		cout << endl;
		Pop(S);
		visited[index1] = 0;
		return;
	}

	p = G->list[index1].edge;
	while (p) {
		if (!visited[p->vex_index])
			DFSALLPath(G, p->vex_index, index2, S);
		p = p->next;
	}

	Pop(S);
	visited[index1] = 0;
}

void PrintAllPath(Graph* G, int index1, int index2) {
	SqStack S;
	CreateStack(&S);
	for (int i = 0; i < G->vexnum; i++)
		visited[i] = 0;
	DFSALLPath(G, index1, index2, &S);
}

int main() {
	Graph G;
	int start, end;

	CreateGraph(&G);
	cout << "请输入起点:" << endl;
	cin >> start;
	cout << "请输入终点:" << endl;
	cin >> end;
	cout << "两顶点间的所有路径:" << endl;

	PrintAllPath(&G, LocateIndex(&G, start), LocateIndex(&G, end));
	DestroyGraph(&G);
	return 0;
}

上一篇:radio两级联动


下一篇:基础算法复习——快速排序