//图 存顶点 存边 存顶点数 存边数 //用临接表存储 #include <iostream> typedef struct bian { int j; struct bian* next; }; //每一个点存储自己的边表,每个点最多10条边 typedef struct dian { char a; bian* bianbiao ; }; //图存储边数,点数,以及点的集合,最多20个点 typedef struct graph { int n,e; struct dian dianbiao[20]; }; struct graph mygraph; int visited[20]; void buildgraph() { for(int i = 0;i<20;i++) visited[i]=0; printf("请输入边数和点数\n"); scanf("%d %d",&mygraph.e,&mygraph.n); getchar(); //printf("请输入点的名字\n"); for(int i = 0;i<mygraph.n;i++) { scanf("%c",&mygraph.dianbiao[i].a); getchar(); mygraph.dianbiao[i].bianbiao= NULL; } //printf("请输入边的编号"); int i,jj; //设成有向边 for(int t = 0;t<mygraph.e;t++) { scanf("%d %d",&i,&jj); //加入链表 bian* newbian = (bian*)malloc(sizeof(bian)); newbian->j = jj; newbian->next = mygraph.dianbiao[i].bianbiao; mygraph.dianbiao[i].bianbiao = newbian; } return; } //参数为点的序号 void dfs(int i) { //输出本身的值 if(visited[i]==0) { printf("%c ",mygraph.dianbiao[i].a); visited[i] = 1; while(mygraph.dianbiao[i].bianbiao!=NULL) { dfs(mygraph.dianbiao[i].bianbiao->j); mygraph.dianbiao[i].bianbiao = mygraph.dianbiao[i].bianbiao->next; if(mygraph.dianbiao[i].bianbiao !=NULL) dfs(mygraph.dianbiao[i].bianbiao->j); } } } typedef struct queue { dian queuedata[100]; int front; int rear; }; queue myqueue; void init() { myqueue.front = 0; myqueue.rear = 0; for(int i = 0;i<100;i++) { myqueue.queuedata[i].a = NULL; myqueue.queuedata[i].bianbiao = NULL; } return ; } void inqueue(dian * _dian) { if(myqueue.front == 100) exit(1); myqueue.queuedata[myqueue.front].a = _dian->a; myqueue.queuedata[myqueue.front].bianbiao = _dian->bianbiao; myqueue.front++; return; } bool isEmpty() { return myqueue.front == myqueue.rear; } dian* outqueue() { dian* ret; if(myqueue.rear<myqueue.front) { ret = &(myqueue.queuedata[myqueue.rear]); myqueue.rear++; } return ret; } void bfs() { inqueue(&(mygraph.dianbiao[0])); visited[0] = 1; dian *temp; while(isEmpty()==0) { temp = outqueue(); printf("%c ",temp->a); while(temp->bianbiao!=NULL) { if(visited[temp->bianbiao->j]==0) { inqueue(&(mygraph.dianbiao[temp->bianbiao->j])); visited[temp->bianbiao->j] = 1; temp->bianbiao = temp->bianbiao->next; } else temp->bianbiao = temp->bianbiao->next; } } } int main() { buildgraph(); //深搜 /*for(int i = 0;i<mygraph.n;i++) { if(visited[i]==0) dfs(i); }*/ //广搜 bfs(); return 0; } //测试数据 //8 6 //a b c d e f //0 1 //0 5 //0 4 //1 5 //1 2 //3 2 //3 5 //4 3