#include <stdio.h> #include <stdlib.h>
#define QUEUE_MAX 10
int count = 0;
typedef struct list { int num;//1-7
struct list* next; }LIST;
typedef struct queue { int front; int rear; int num[QUEUE_MAX]; }QUEUE;
void init_queue(QUEUE* Q) { Q->front = 0; Q->rear = 0; }
int IS_EMPTY(QUEUE* Q) { if(Q->rear==Q->front) return 1; else return 0; } int IS_FULL(QUEUE* Q) { if((Q->rear+1)%QUEUE_MAX==Q->front) return 1; else return 0; }
void en_queue(QUEUE* Q, int num) { if(IS_FULL(Q)) return; Q->num[Q->rear] = num; Q->rear = (Q->rear+1)%QUEUE_MAX; }
int de_queue(QUEUE* Q) { if(IS_EMPTY(Q)) return -1; int num; num = Q->num[Q->front]; Q->front = (Q->front+1)%QUEUE_MAX; return num; }
void init_list_head(LIST** L) { *L = (LIST*)malloc(sizeof(LIST)); (*L)->num = 0; (*L)->next = NULL; }
LIST* create_new_node() { LIST* p = (LIST*)malloc(sizeof(LIST)); p->num = 0; p->next = NULL; return p; }
void add_new_node(LIST* L, LIST* p) { p->next = L->next; L->next = p; }
int create_adjacency_matrix( LIST* L[7], int A[7][7]) { int i; int j; for(i=0;i<7;i++) { init_list_head(&L[i]); for(j=0;j<7;j++) { if(A[i][j]!=0) { LIST* p = create_new_node(); p->num = j+1; add_new_node(L[i], p); } } } }
void print_adjacency_matrix(LIST* L[7]) { int i; LIST* p = NULL; for(i=0;i<7;i++) { p = L[i]->next; if(p!=NULL) printf("%d:\t",i+1); else { printf("%d:\n",i+1); continue; } while(p!=NULL) { if(p->next!=NULL) printf("%d->",p->num); else printf("%d\n",p->num); p = p->next; } } } int* bfs(LIST* L[7], int num) { QUEUE* Q = (QUEUE*)malloc(sizeof(QUEUE)); init_queue(Q); en_queue(Q,num); int currdist = 0; int flag = 0; int i = 0; int ret = 0; int* bfs = (int*)malloc(sizeof(int)*7); int known[7]; for(i=0;i<7;i++) { bfs[i] = 0; known[i] = 0; } bfs[flag++] = num; for(i=0;i<7;i++) { ret = de_queue(Q); LIST* p = L[ret-1]->next; if(p == NULL) continue; while(p!=NULL) { en_queue(Q,p->num); if(known[p->num-1] == 0) { bfs[flag++] = p->num; known[p->num-1] = 1; } p = p->next; if(flag == 7) return bfs; } } }
int count_dfs(LIST* L[7], int visit[7], int dfs[7], int num) { //printf("num is %d, start is %d\n", num, count);
//printf("visited %d\n", num);
if(count>=7) return 0; visit[num-1] = 1; dfs[count++] = num; LIST* p = L[num-1]->next; while(p!=NULL) { if(visit[p->num-1]==0) count_dfs(L, visit, dfs, p->num); p = p->next; } }
void print_array(int dist[], int n) { int i; for(i=0;i<n;i++) { printf("%d\n", dist[i]); } }
int main(int argc, char *argv[]) { int A[7][7] = { {0,1,0,1,0,0,0}, {0,0,0,1,1,0,0}, {1,0,0,0,0,1,0}, {0,0,1,0,1,1,1}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,0,0,0,1,0} };
LIST** L = (LIST**)malloc(sizeof(LIST)*7); create_adjacency_matrix( L, A); print_adjacency_matrix(L); int* dist = bfs(L, 3); printf("graph bfs is:\n"); print_array(dist, 7); int visit[7] = {0,0,0,0,0,0,0}; int dfs[7] = {0,0,0,0,0,0,0}; count_dfs(L, visit, dfs, 3); printf("graph dfs is:\n"); print_array(dfs, 7); system("PAUSE"); return 0; }
|