C语言深度搜索爱吃窝窝头2023-11-302023-11-30#include <stdio.h>#include <stdlib.h>#define N 20typedef struct link{ int data;//代表数据域 struct link *next;//代表指针域,指向后继元素}link;//link为节点名,每个节点都是一个link结构体link *b[N];//头节点//定义链队列的类型typedef struct linkqueue{ link *front;//队头指针 link *rear;//队尾指针}linkq;linkq q;//定义一个链队列//初始化链队列void initqlink(){ q.front=(link *)malloc(sizeof(link)); if (!q.front) exit(0); q.front->next=NULL; q.rear=q.front;//空队列}//入队(插入)void enqlink(int e){ link *p; p=(link *)malloc(sizeof(link)); if (!p) exit(0); p->data=e; p->next=NULL; q.rear->next=p;//连接作用 q.rear=p;//修改队尾指针}//出队(删除)int deqlink(){ link *p; int x; if(q.rear==q.front){ printf("空队列,不进行删除\n"); exit(0); } p=q.front->next; x=p->data; q.front->next=p->next; if(p==q.rear)//如果队尾指针没有,空队列 q.rear=q.front; free(p); return x;}//创建邻接链表void creat(int n){ int u,v; link *p; for(u=0;u<n;u++) b[u]=NULL; scanf("%d%d",&u,&v); while(u>=0) { p=(link*)malloc(sizeof(link)); p->data=v; p->next=b[u]; b[u]=p; scanf("%d%d",&u,&v); }}//遍历void output(int n){ link *p; int u; for(u=0;u<n;u++) { printf("%5d",u); p=b[u]; while(p) { printf("->"); printf("%2d",p->data); p=p->next; } printf("\n"); }}//深度优先搜索int vst[N]={0};void dfs(int u){ link *p; int v; printf("%d ",u); vst[u]=1; //已被访问 p=b[u]; while(p) { v=p->data; if(vst[v]==0) dfs(v); //递归 p=p->next; }}//广度优先搜索int bvst[N]={0};void bsf(int u){ link *p; int v,x; printf("%d ",u); bvst[u]=1; enqlink(u); while(q.front!=q.rear){ v=deqlink(); p=b[v]; while (p) { x=p->data; if(bvst[x]==0){ printf("%d ",x); bvst[x]=1; enqlink(x); } p=p->next; } }}void main(){ initqlink(); creat(6); printf("邻接表为:\n"); output(6); printf("深度优先搜索结果:"); dfs(0); printf("\n"); printf("广度优先搜索结果:"); bsf(0);}