搜索算法

#include <stdio.h>
#define N 20
int dfn[N];
int bfn[N];
int visited[N];
int count = 1;
int empty[N];
FILE *fp1;
FILE *fp2;
typedef struct {
int verlist[N];
int edge[N][N];
int n, e;
}MTGraph;
typedef struct node {
int adjvex;
int cost;
struct node *next;
}EdgeNode;
typedef struct {
int vertex;
EdgeNode *firstedge;
}VertexNode;
typedef struct {
VertexNode vexlist[N];
int n, e;
}AdjGraph;

void CreateMTGraph(MTGraph *G)
{
int i, j, k, w;
printf(“输入顶点数和边数:\n”);
fscanf(fp1, “%d,%d”, &G->n, &G->e);
//G->n = getw(fp);
//G->e = getw(fp);
//scanf("%d", &G->n);
//scanf("%d", &G->e);

for (i = 0; i < G->n; i++)
{
	fscanf(fp1, "%d ", &k);
	G->verlist[i] = k;
	//printf("输入编号:");
	//scanf("%d", &G->verlist[i]);
}
for (i = 0; i < G->n; i++)
	for (j = 0; j < G->n; j++)
		G->edge[i][j] = 0;
for (k = 0; k < G->e; k++)
{
	//printf("输入(i,j, w):");
	//scanf("%d%d%d", &i, &j, &w);
	//G->edge[getw(fp)][getw(fp)] = getw(fp);
	fscanf(fp1, "%d,%d,%d", &i, &j, &w);
	G->edge[i][j] = w;
}

}
void PrintMTGraph(MTGraph *G)
{
int i, j;
for (i = 0; i < G->n; i++) {
for (j = 0; j < G->n; j++)
{
printf("%d “, G->edge[i][j]);
}
printf(”\n");
}
}
void CreateGraph(AdjGraph *G)
{
int t, j, w;
printf(“输入顶点n和边数e:”);
//scanf("%d", &G->n);
//scanf("%d", &G->e);
fscanf(fp2, “%d,%d”, &G->n, &G->e);
for (int i = 0; i < G->n; i++)
{
fscanf(fp2, “%d “, &G->vexlist[i].vertex);
//printf(“输入编号:”);
//scanf(”%d”, &G->vexlist[i].vertex);//顶点名字
}
for (int i = 0; i < G->n; i++)
G->vexlist[i].firstedge = NULL;//初始化
for (int i = 0; i < G->e; i++) {
//printf(“输入(i,j,k):”);
//scanf("%d%d%d", &t, &j, &w);
fscanf(fp2, “%d,%d,%d”, &t, &j, &w);
EdgeNode *p = (EdgeNode *)malloc(sizeof(EdgeNode));
p->adjvex = j; p->cost = w;//j是被指的那个
p->next = G->vexlist[t].firstedge;
G->vexlist[t].firstedge = p;//出边表
//EdgeNode *p = (EdgeNode )malloc(sizeof(EdgeNode));
//p->adjvex = t; p->cost = w;
//p->next = G->vexlist[j].firstedge;
//G->vexlist[j].firstedge = p;
}
}
void PrintGraph(AdjGraph
G)
{
printf("(序号,名字)\t(序号,权值)\n");
for (int i = 0; i < G->n; i++)
{
printf("%d,%d\t\t", i, G->vexlist[i].vertex);
EdgeNode *p = G->vexlist[i].firstedge;
while § {
printf("%d,%d\t", p->adjvex, p->cost);
p = p->next;
}
printf("\n");
}
}
void DFS1(AdjGraph *G, int i)
{
EdgeNode *p;
printf("%d ", G->vexlist[i].vertex);//按遍历顺序打印名字
visited[i] = 1;
//标遍历的顺序
dfn[i] = count++;
p = G->vexlist[i].firstedge;
//如果闭环,则回到原点时visited为1,去下一个分支next;
while § {
if (!visited[p->adjvex])
DFS1(G, p->adjvex);
p = p->next;//next和firstedge有区别
}

}
void DFS2(MTGraph *G, int i)
{
printf("%d ", G->verlist[i]);
visited[i] = 1;
dfn[i] = count++;
for (int j = 0; j < G->n; j++)
{
if (G->edge[i][j] != 0 && !visited[j])
DFS2(G, j);
}
}
void DFSTraverse(AdjGraph G)
{
int i; count = 1;
for (i = 0; i < G->n; i++)
{
visited[i] = 0;//初始话为0
dfn[i] = 0;
}
for (i = 0; i < G->n; i++)
if (!visited[i])
DFS1(G, i);
}
void DFSTraverse2(MTGraph G)
{
int i; count = 1;
for (i = 0; i < G->n; i++)
{
visited[i] = 0;//初始话为0
dfn[i] = 0;
}
for (i = 0; i < G->n; i++)
if (!visited[i])
DFS2(G, i);
}
void Deep(int flag, MTGraph
G1, AdjGraph
G2)
{
count = 1;//为了使count可以重置为1
if (flag == 1)
DFSTraverse(G2);//G1
else
DFSTraverse(G2);
}
typedef struct Cx {
int element;
struct Cx *next;
}celltype;
typedef struct Q {
celltype *front;
celltype *rear;
}Queue;
void MakeNull(Queue Q)//ok
{
Q->front = (celltype
)malloc(sizeof(celltype));
Q->front->next = NULL;
Q->rear = Q->front;
}
int Empty(Queue *Q)//ok
{
if (Q->front == Q->rear)
return 1;
else
return 0;
}
void EnQueue(int x, Queue Q)//ok
{
Q->rear->next = (celltype
)malloc(sizeof(celltype));
Q->rear = Q->rear->next;
Q->rear->element = x;
Q->rear->next = NULL;
}
int DeQueue(Queue *Q)
{
int i;
celltype *tmp;
if (Empty(Q))
{
return -1;
}
else {

	tmp = Q->front->next;
	i = tmp->element;
	Q->front->next = tmp->next;
	// tmp;
	if (Q->front->next == NULL)
		Q->rear = Q->front;
	return i;
}

}
void BFS1(AdjGraph *G, int k)
{
int i;
EdgeNode *p;
Queue Q = (Queue)(malloc(sizeof(Queue)));
MakeNull(Q);
printf("%d", G->vexlist[k].vertex);
visited[k] = 1;
bfn[k] = count++;
EnQueue(k, Q);
while (!Empty(Q)) {
i = DeQueue(Q);
p = G->vexlist[i].firstedge;
while § {
if (!visited[p->adjvex]) {
printf("%d", G->vexlist[p->adjvex].vertex);
visited[p->adjvex] = 1;
EnQueue(p->adjvex, Q);
}
p = p->next;
}
}
}
void BFSTraverse(AdjGraph *G)
{
int i; count = 1;
for (i = 0; i < G->n; i++)
{
visited[i] = 0;//初始话为0
bfn[i] = 0;
}
for (i = 0; i < G->n; i++)
if (!visited[i])
BFS1(G, i);
}

void BFS2(MTGraph *G, int k)
{
int i;
Queue Q = (Queue)(malloc(sizeof(Queue)));
MakeNull(Q);
printf("%d “, G->verlist[k]);
visited[k] = 1;
EnQueue(k, Q);
while (!Empty(Q))
{
i = DeQueue(Q);
for (int j = 0; j < G->n; j++)
{
if (!visited[j] && G->edge[i][j] != 0)
{
printf(”%d ", G->verlist[j]);
visited[j] = 1;
EnQueue(j, Q);
}
}
}
}
void BFSTraverse2(MTGraph *G)
{
int i; count = 1;
for (i = 0; i < G->n; i++)
{
visited[i] = 0;//初始话为0
bfn[i] = 0;
}
for (i = 0; i < G->n; i++)
if (!visited[i])
BFS2(G, i);
}
//广度

void MtoS(MTGraph* G1, AdjGraph* G3)
{
G3->n = G1->n; G3->e = G1->e;
for (int i = 0; i < G3->n; i++)
G3->vexlist[i].vertex = G1->verlist[i];//复制矩阵verlist中的名字
for (int i = 0; i < G3->n; i++)
G3->vexlist[i].firstedge = NULL;//初始化
for (int i = 0; i < G3->n; i++)
for (int j = 0; j < G3->n; j++)
if (G1->edge[i][j] != 0)
{
EdgeNode p = (EdgeNode )malloc(sizeof(EdgeNode));
p->adjvex = j; p->cost = G1->edge[i][j];
p->next = G3->vexlist[i].firstedge;
G3->vexlist[i].firstedge = p;
}
}
void StoM(AdjGraph
G2, MTGraph
G4)
{
G4->n = G2->n; G4->e = G2->e;
for (int i = 0; i < G4->n; i++)
for (int j = 0; j < G4->n; j++)
G4->edge[i][j] = 0;
for (int i = 0; i < G4->n; i++)
G4->verlist[i] = G2->vexlist[i].vertex;
EdgeNode* p;
for (int i = 0; i < G2->n; i++)
{
p = G2->vexlist[i].firstedge;
while § {
G4->edge[i][p->adjvex] = p->cost;
p = p->next;
}
}
}
int Menu()
{
int n;
printf(“\n");
printf(“1.矩阵表\t2.邻接表\n3.矩阵转邻接\t4.邻接转矩阵\n”);
printf(“5.深度(矩阵)\t6.深度(邻接表)\n”);
printf(“7.广度(矩阵)\t8.广度(邻接表)\n”);
printf(“0退出\n”);
printf("
\n”);
scanf("%d", &n);
return n;
}
int main()
{
//AdjGraph G2= (AdjGraph)malloc(sizeof(AdjGraph));//好像必须要用malloc给一块区域,原来只是一个地址,里面什么都没有
//CreateGraph(G2);
//PrintGraph(G2);
//MTGraph G = (MTGraph)malloc(sizeof(MTGraph));
//CreateMTGraph(G);
//PrintMTGraph(G);
int n;
MTGraph G1 = (MTGraph)malloc(sizeof(MTGraph));
AdjGraph G2 = (AdjGraph)malloc(sizeof(AdjGraph));
AdjGraph G3 = (AdjGraph)malloc(sizeof(AdjGraph));
MTGraph G4 = (MTGraph)malloc(sizeof(MTGraph));
n = Menu();
while (n) {
switch (n)
{
case 1:
if ((fp1 = fopen(“file1.txt”, “r”)) == NULL)
{
printf("\n Cannot open the file!");
exit(0);
}
CreateMTGraph(G1);
PrintMTGraph(G1);
fclose(fp1);
break;
case 2:
if ((fp2 = fopen(“file2.txt”, “r”)) == NULL)
{
printf("\n Cannot open the file!");
exit(0);
}
CreateGraph(G2);
PrintGraph(G2);
break;
case 3:
MtoS(G1, G3);
PrintGraph(G3);
break;
case 4:
StoM(G2, G4);
PrintMTGraph(G4);
break;
case 5:
DFSTraverse2(G1);
break;
case 6:
DFSTraverse(G2);
break;
case 7:
BFSTraverse2(G1);
break;
case 8:
BFSTraverse(G2);
break;
case 0:
return 0;
break;
default:
printf(“Please input correct order.\n”);
break;
}
n = Menu();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值