测试样例
请输入图顶点个数! 6 请输入连通的两个点,以输入0 0结束! 1 2 1 3 2 4 5 6 6 3 4 3 0 0 你输入的图为: 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 请输入你的操作类型: 退出 0 图的边数 1 任何两个顶点是否相连 2 求一个顶点的度是多少 3 1 图的边数为: 6 请输入你的操作类型: 退出 0 图的边数 1 任何两个顶点是否相连 2 求一个顶点的度是多少 3 2 请输入两个顶点的位置! 1 3 顶点1与顶点3相连! 请输入你的操作类型: 退出 0 图的边数 1 任何两个顶点是否相连 2 求一个顶点的度是多少 3 2 请输入两个顶点的位置! 1 6 顶点1与顶点6不相连! 请输入你的操作类型: 退出 0 图的边数 1 任何两个顶点是否相连 2 求一个顶点的度是多少 3 3 请输入顶点: 3 顶点3的度为:3 请输入你的操作类型: 退出 0 图的边数 1 任何两个顶点是否相连 2 求一个顶点的度是多少 3 0 Press any key to continue
代码如下
#include<stdio.h> #include<stdlib.h> typedef struct ArcNode { int adjves; //int weight; struct ArcNode * nextarc; }ArcNode; typedef struct { int data; ArcNode firstarc; }AdjList; typedef struct { AdjList *vertices; int vexnum, arcnum; }ALGraph; ALGraph alg; int str[100][100] = {0}; /**//////////////////////////////////////void initail();//初始化邻接表 void insert(int i, int j);//向邻接表插入一条边 void printAlg();//打印邻接表 void DfsTraverseALG(int i);//深优遍历 void DfsALG(int i, int *visit);/**////深优遍历主体 void printMgraph();//打印矩阵 int Arcs(int i);//求某个顶点的度 bool isArc(int, int);//某两个点是否相连 int getArcnumOfGraph();//获得图的边数 int main() { int i, j, k; scanf("%d", &(alg.vexnum)); initail(); while (1) { printf("->"); scanf("%d%d", &i, &j);//按题意输入的点序号都大于0 if (i == 0 && j == 0) { break; } insert( i, j); } printAlg(); printf("DfsTraverseALG:\n"); DfsTraverseALG(1); printf("请输入你的操作类型:\n"); printf("退出 0\n"); printf("图的边数 1\n"); printf("任何两个顶点是否相连 2\n"); printf("求一个顶点的度是多少 3\n"); while (1) { scanf("%d", &k); if (k == 0) { break; } else if (k == 1) { printf("图的边数为:%d\n", getArcnumOfGraph()); } else if (k == 2) { printf("请输入两个顶点的位置!\n"); scanf("%d%d", &i, &j); if (isArc(i - 1, j)) { printf("顶点%d与顶点%d相连!\n", i, j); } else { printf("顶点%d与顶点%d不相连!\n", i, j); } } else if (k == 3) { printf("请输入顶点:\n"); scanf("%d", &i); printf("顶点%d的度为:%d\n",i, Arcs(i - 1)); } else { printf("输入错误,请重新输入\n"); } } system("pause"); return 0; } void initail() { int n = alg.vexnum; alg.arcnum = 0; int i; alg.vertices = (AdjList*)malloc(n * sizeof(AdjList)); for (i = 0; i < n; i++) { alg.vertices[i].firstarc.nextarc = NULL; alg.vertices[i].data = i + 1; } } void insert(int i, int j) { i--; j--; ArcNode *p; p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjves = j + 1; p->nextarc = alg.vertices[i].firstarc.nextarc;//复制邻接表顶点的邻接点 alg.vertices[i].firstarc.nextarc = p; p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjves = i + 1; p->nextarc = alg.vertices[j].firstarc.nextarc;//复制邻接表顶点的邻接点 alg.vertices[j].firstarc.nextarc = p; alg.arcnum++;//边数加一 }
void printAlg() { int i; ArcNode *p; for (i = 0; i < alg.vexnum; i++) { printf("%d:\t", i + 1); p = alg.vertices[i].firstarc.nextarc; while (p != NULL) { printf("%d\t", p->adjves); p = p->nextarc; } printf("\n"); } }
/**//////////////////////////////////////////////////void DfsTraverseALG(int i) { int j, n = alg.vexnum; int *visit = (int*)malloc(alg.vexnum * sizeof(int)); i--; for (j = 0; j < alg.vexnum; j++) { visit[j] = 0; } for (j = 0; j < alg.vexnum; j++) { if (visit[j] == 0) { DfsALG(i, visit); } } printf("\n"); printMgraph();/**/////////////////// free(visit); } void DfsALG(int i, int *visit) { ArcNode *p; int j; visit[i] = 1; printf("%d\t", alg.vertices[i].data); p = alg.vertices[i].firstarc.nextarc; while (p != NULL) { j = p->adjves - 1; str[i][j] = 1; if (visit[j] == 0) { DfsALG(j, visit); } p = p->nextarc; } } void printMgraph() { int i, j; printf("Mgraph:\n"); for (i = 0; i < alg.vexnum; i++) { for (j = 0; j < alg.vexnum; j++) { printf("%d ", str[i][j]); } printf("\n"); } } /**/////////////////////////////////////////////// int Arcs(int i) { int j = 0; ArcNode *p = alg.vertices[i].firstarc.nextarc; while (p != NULL) { j++; p = p->nextarc; } return j; } bool isArc(int i, int j) { ArcNode *p = alg.vertices[i].firstarc.nextarc; while (p != NULL) { if (p->adjves == j) { return true; } p = p->nextarc; } return false; } int getArcnumOfGraph() { return alg.arcnum; }
|