matrix_path.c #include <stdio.h> #include <stdlib.h> #define MAXLEN 10 typedef struct { char vexs[MAXLEN]; int edges[MAXLEN][MAXLEN]; int n, e; }MGraph; typedef struct { char *ss; int top; int bottom; int len; }stack; typedef struct { int* que; int front, rear; }queue; void init_queue(queue *q) { q->front = q->rear = 0; q->que = (void *)malloc(sizeof(int)*MAXLEN); } void enqueue(queue *q, int k) { if((q->rear + 1 - q->front) % MAXLEN == 0) { printf("queue full/n"); return ; } q->que[q->rear] = k; q->rear = (q->rear + 1) % MAXLEN; } int dequeue(queue *q) { int ret; if(q->rear == q->front) { printf("queue empty/n"); exit(-1); } ret = q->que[q->front]; q->front = (q->front + 1) % MAXLEN; return ret; } int isempty(queue q) { if(q.rear == q.front) return 1; else return 0; } void createMGraph(MGraph *g) { int flag = 0; int i, j, k; char ch1, ch2; printf("input the number of vertexs and edges :/n"); scanf("%d %d", &(g->n), &(g->e)); printf("input the name of each vertex:/n"); for(i = 0; i < g->n; i++) { getchar(); scanf("%c", &(g->vexs[i])); } for(i = 0; i < g->n; i++) for(j = 0;j < g->n; j++) g->edges[i][j] = 0; printf("input the two vertexs that there is a path between them/n"); for(k = 0; k < g->e; k++) { getchar(); printf("input the %d edges:(i,j)/n", k+1); scanf("%c,%c", &ch1, &ch2); for(i = 0; i < g->n; i++) { if(ch1 != g->vexs[i]) continue; for(j = 0; j < g->n; j++) { if(ch2 != g->vexs[j]) continue; g->edges[i][j] = 1; flag = 1; break; } if (flag == 1) break; } } } void init_stack(stack * s) { s->ss = (char *)malloc(sizeof(char)*MAXLEN); s->top = s->bottom =0; s->len = MAXLEN; } void push(stack *s, char start) { if(s->top >= s->len) s->ss = realloc(s->ss, sizeof(char) * 100); (s->ss)[s->top++] = start; } char pop(stack *s) { char c; c = s->ss[--(s->top)]; return c; } void yes(stack *s, char * path) { int i = s->top; path[i] = '/0'; for(;i > 0; i--) { path[i - 1] = pop(s); } } int find_path(stack * s, MGraph g, char start, char end) { int i, j; int flag = 0; push(s, start); for(i = 0; i < g.n; i++) { if(g.vexs[i] != start) continue; for(j = 0; j < g.n; j++ ) { if(g.edges[i][j] != 1) continue; if(g.vexs[j] == end) { push(s, end); flag = 1; break; } else { return find_path(s, g, g.vexs[j], end); } } if(flag == 1) break; } return flag; } void DFSM(MGraph * g, int i, int visited[]) { int j; printf("/t/tnode:/t%c/n", g->vexs[i]); visited[i] = 1; for(j = 0; j < g->n; j++) if(g->edges[i][j] == 1 && !visited[j]) DFSM(g, j, visited); } void DFSTraverseM(MGraph *g) { int visited[g->n]; int i; for(i = 0; i < g->n; i++) visited[i] = 0; for(i = 0; i < g->n; i++) if(!visited[i]) DFSM(g, i, visited); } void BFSM(MGraph *g, int i, int visited[]) { int j, k; printf("/t/tnode:/t%c/n", g->vexs[i]); visited[i] = 1; queue q; init_queue(&q); enqueue(&q, i); while(!isempty(q)) { k = dequeue(&q); for(j = 0; j < g->n; j++) if(g->edges[k][j] == 1 && !visited[j]) { printf("/t/tnode:/t%c/n", g->vexs[j]); visited[j] = 1; enqueue(&q, j); } } } void BFSTraverseM(MGraph *g) { int visited[g->n]; int i; for(i = 0; i < g->n; i++) visited[i] = 0; for(i = 0; i < g->n; i++) if(!visited[i]) BFSM(g, i, visited); } void main() { int i, j; int flag; char start, end; char *path; MGraph g; createMGraph(&g); DFSTraverseM(&g); BFSTraverseM(&g); #if 0 stack s; init_stack(&s); for( i = 0; i < g.n; i++) { for( j = 0; j < g.n; j++) printf("%d/t", g.edges[i][j]); printf("/n"); } path = (char *)malloc(g.n*sizeof(char)); printf("input the two vertexs you want to find a path:(start,end)/n"); getchar(); scanf("%c, %c", &start, &end); printf("%c/t%c/n", start, end); flag = find_path(&s, g, start, end); if(flag == 1) { yes(&s, path); printf("the path is %s/n", path); } else printf("no path/n"); #endif } adj_path.c #include <stdio.h> #include <stdlib.h> #define MAXLEN 10 typedef struct node { int adjvex; struct node * next; }EdgeNode; typedef struct vnode { char vertex; EdgeNode * firstedge; }VertexNode; typedef VertexNode AdjList[MAXLEN]; typedef struct { AdjList adjlist; int n, e; }ALGraph; void createALGraph(ALGraph * alg) { int i, j, k; EdgeNode * s; printf("input the number of vertexs and edges :(i,j)/n"); scanf("%d,%d", &(alg->n), &(alg->e)); printf("input the information of vertexs:/n"); for(i = 0; i < alg->n; i++) { scanf("/n%c", &(alg->adjlist[i].vertex)); alg->adjlist[i].firstedge = NULL; } printf("input the information of the edge:(i,j)/n"); for(k = 0; k < alg->e; k++) { printf("input the %d edge:/n", k+1); scanf("/n%d,%d", &i, &j); s = (EdgeNode *)malloc(sizeof(EdgeNode)); s->adjvex = j; s->next = alg->adjlist[i].firstedge; alg->adjlist[i].firstedge = s; } } void main() { int i, j; ALGraph alg; createALGraph(&alg); for(i = 0; i < alg.n; i++) { printf("%d(%c):/t", i, alg.adjlist[i].vertex); EdgeNode * s = alg.adjlist[i].firstedge; while(s) { printf("%d(%c)/t", s->adjvex, alg.adjlist[s->adjvex].vertex); s = s->next; } printf("/n"); } } ww_project.c #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_VERTEX_NUM 20 #define BUF_MAX_LENGTH 50 //char cap[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int path[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int path_index = 0; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; int cap; }ArcNode; typedef struct VNode{ int data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct ALgraph{ AdjList vertices; int vexnum,arcnum; //int kind; }ALgraph; int readfile(char * buf, FILE * fp) { int i = 0; char c; int tmp; while((c = fgetc(fp)) != EOF) { if(c != ' ' && c != '/n') { buf[i] = c; i++; } else { buf[i] = '/0'; i = 0; tmp = atoi(buf); memset(buf, '/0', BUF_MAX_LENGTH); return tmp; } } } void createALgraph(ALgraph *g, int *s, int *t) { int i, j, k; int node1, node2, cap; ArcNode * tmp_arc; FILE * fp; char buf[BUF_MAX_LENGTH]; memset(buf, '/0', BUF_MAX_LENGTH); fp = fopen("input.txt", "rb"); //input vertex number g->vexnum = readfile(buf, fp); //input arc number g->arcnum = readfile(buf, fp); for(i = 1; i <= g->vexnum; i++) { g->vertices[i].data = i; g->vertices[i].firstarc = NULL; } //input s and t *s = readfile(buf, fp); *t = readfile(buf, fp); //input each arc and build adjacency list for(k = 0; k < g->arcnum; k++) { tmp_arc = (ArcNode *)malloc(sizeof(ArcNode)); node1 = readfile(buf, fp); node2 = readfile(buf, fp); cap = readfile(buf, fp); tmp_arc->adjvex = node2; tmp_arc->nextarc = g->vertices[node1].firstarc; tmp_arc->cap = cap; g->vertices[node1].firstarc = tmp_arc; } } void find_path(int tmp_path[], int index, ALgraph g, int start, int end) { int i, j; int flag = 0; ArcNode * s = (ArcNode *)malloc(sizeof(ArcNode)); for( i = 1;i <= g.vexnum; i++) { if(g.vertices[i].data != start) continue; tmp_path[index++] = start; s = g.vertices[i].firstarc; while(s) { if(s->adjvex == end) { tmp_path[index++] = end; //tmp_path[index] = '/0'; //strcpy(path[path_index++], tmp_path); for(j = 0; tmp_path[j] != end; j++) path[path_index][j] = tmp_path[j]; path[path_index][j] = end; path_index++; flag = 1; } else { if(flag == 1) { index--; flag =0; } find_path(tmp_path, index, g, s->adjvex, end); } s = s->nextarc; } } } void BFSM_PATH(ALgraph g, int start, int end) { int i; int index = 0; int tmp_path[MAX_VERTEX_NUM]; //char tmp_cap[MAX_VERTEX_NUM]; //memset(tmp_path, '/0', MAX_VERTEX_NUM); for(i = 0; i< MAX_VERTEX_NUM; i++) tmp_path[i] = 0; //memset(tmp_cap, '/0', MAX_VERTEX_NUM); find_path(tmp_path, index, g, start, end); } void main() { int i, j; int s, t; ALgraph g; //memset(path, '/0', MAX_VERTEX_NUM*MAX_VERTEX_NUM); //memset(cap, '/0', MAX_VERTEX_NUM*MAX_VERTEX_NUM); createALgraph(&g, &s, &t); #if 0 printf("%d,%d/n", g.vexnum, g.arcnum); for( i = 1; i <= g.vexnum; i++) { printf("%d:/t", g.vertices[i].data); ArcNode * s = g.vertices[i].firstarc; while(s) { printf("%d(%d)/t", s->adjvex, s->cap); s = s->nextarc; } printf("/n"); } #endif BFSM_PATH(g, s, t); if (path_index == 0) printf("no path;/n"); else{ printf("the path include :/n"); for( i = 0; i < path_index; i++) { for(j = 0; path[i][j] != 0; j++) printf("%d/t", path[i][j]); printf("/n"); //printf("%s/n", cap[i]); } } } min_tree.c #include <stdio.h> #include <stdlib.h> #define MAXLEN 10 typedef struct { char vexs[MAXLEN]; int edges[MAXLEN][MAXLEN]; int n, e; }MGraph; typedef struct { int* que; int front, rear; }queue; void init_queue(queue *q) { q->front = q->rear = 0; q->que = (void *)malloc(sizeof(int)*MAXLEN); } void enqueue(queue *q, int k) { if((q->rear + 1 - q->front) % MAXLEN == 0) { printf("queue full/n"); return ; } q->que[q->rear] = k; q->rear = (q->rear + 1) % MAXLEN; } int dequeue(queue *q) { int ret; if(q->rear == q->front) { printf("queue empty/n"); exit(-1); } ret = q->que[q->front]; q->front = (q->front + 1) % MAXLEN; return ret; } int isempty(queue q) { if(q.rear == q.front) return 1; else return 0; } void createMGraph(MGraph *g) { int flag = 0; int i, j, k; char ch1, ch2; printf("input the number of vertexs and edges :/n"); scanf("%d %d", &(g->n), &(g->e)); printf("input the name of each vertex:/n"); for(i = 0; i < g->n; i++) { getchar(); scanf("%c", &(g->vexs[i])); } for(i = 0; i < g->n; i++) for(j = 0;j < g->n; j++) g->edges[i][j] = 0; printf("input the two vertexs that there is a path between them/n"); for(k = 0; k < g->e; k++) { getchar(); printf("input the %d edges:(i,j)/n", k+1); scanf("%c,%c", &ch1, &ch2); for(i = 0; i < g->n; i++) { if(ch1 != g->vexs[i]) continue; for(j = 0; j < g->n; j++) { if(ch2 != g->vexs[j]) continue; g->edges[i][j] = 1; flag = 1; break; } if (flag == 1) break; } } } void DFSM(MGraph * g, int i, int visited[]) { int j; printf("/t/tnode:/t%c/n", g->vexs[i]); visited[i] = 1; for(j = 0; j < g->n; j++) if(g->edges[i][j] == 1 && !visited[j]) DFSM(g, j, visited); } void DFSTraverseM(MGraph *g) { int visited[g->n]; int i; for(i = 0; i < g->n; i++) visited[i] = 0; for(i = 0; i < g->n; i++) if(!visited[i]) DFSM(g, i, visited); } void BFSM(MGraph *g, int i, int visited[]) { int j, k; printf("/t/tnode:/t%c/n", g->vexs[i]); visited[i] = 1; queue q; init_queue(&q); enqueue(&q, i); while(!isempty(q)) { k = dequeue(&q); for(j = 0; j < g->n; j++) if(g->edges[k][j] == 1 && !visited[j]) { printf("/t/tnode:/t%c/n", g->vexs[j]); visited[j] = 1; enqueue(&q, j); } } } void BFSTraverseM(MGraph *g) { int visited[g->n]; int i; for(i = 0; i < g->n; i++) visited[i] = 0; for(i = 0; i < g->n; i++) if(!visited[i]) BFSM(g, i, visited); } void main() { MGraph *g, a; char ch1; int i, j, ch2; g = &a; printf("create a Adjacency matrix of Directed graph/n"); createMGraph(g); printf("created successfully/n"); for( i = 0; i < g->n; i++) { for( j = 0; j < g->n; j++) printf("%d/t", g->edges[i][j]); printf("/n"); } ch1 = 'y'; while(ch1 == 'y' || ch1 == 'Y') { printf("/n/n/n/n/n/t/tgraph system/n"); printf("/t/t*************************************/n"); printf("/t/t* 1---update graph */n "); printf("/t/t* 2---DFST */n"); printf("/t/t* 3---BFST */n"); printf("/t/t* 0---exit */n"); printf("/t/tchoose the menu number(0-3):"); scanf("%d", &ch2); switch(ch2) { case 1 : createMGraph(g); printf("/t/tcreate MGraph/n"); break; case 2 : DFSTraverseM(g); break; case 3 : BFSTraverseM(g); break; case 0 : ch1 = 'n'; break; default : printf("/t/tinput wrong number/n"); } } }