创建邻接表
typedef struct adjnode{ //邻接点
int adj;
// int w;
struct adjnode *next;
}*Adj;
typedef struct vnode{ //顶点
int data;
Adj first;
}adjlist[20];
typedef struct gnode{ //图
int vexnum,arcnum;
adjlist vnode;
}*graph;
graph creategh(){ //初始化一个只有顶点的图(无向图)
int i;
graph gh;
gh = (graph)malloc(sizeof(struct gnode));
printf("输入顶点数:");
scanf("%d",&gh->vexnum);
gh->arcnum = 0;
for(i=0;i < gh->vexnum;i++){
gh->vnode[i].data = i;
gh->vnode[i].first = NULL;
}
return gh;
}
void insertedge(graph gh){ //连接图的顶点
int i,j;
int v1,v2;
printf("输入弧数:");
scanf("%d",&gh->arcnum);
for(i=0;i < gh->arcnum;i++){
Adj adj1 = (Adj)malloc(sizeof(struct adjnode));
Adj adj2 = (Adj)malloc(sizeof(struct adjnode));
printf("输入头尾:");
scanf("%d%d",&v1,&v2);
//头插
adj1->adj = v2;
adj1->next = gh->vnode[v1].first;
gh->vnode[v1].first = adj1;
//无向图一条边要插入两次
adj2->adj = v1;
adj2->next = gh->vnode[v2].first;
gh->vnode[v2].first = adj2;
}
}
/********图的邻接表创建完成********/
访问标记数组,dfs和bfs都需要
int visited[20] = {0}; //0表示未访问,1表示已访问
一、深度优先搜索dfs
void dfstravers(graph gh,int n){
visited[n] = 1;
printf("%d ",n+1);
Adj p = gh->vnode[n].first;
while(p){
if(visited[p->adj]==0)
dfstravers(gh,p->adj);
p = p->next;
}
}
二、广度优先搜索bfs
(1)辅助队列,这边用的是循环队列
typedef struct qnode{
int *data;
int front,rear;
int maxsize;
int length;
}qnode,*queue;
queue createqueue(int maxsize){ //创建一个空队列
queue q;
q = (queue)malloc(sizeof(qnode));
q->maxsize = maxsize;
q->data = (int*)malloc(sizeof(int)*maxsize);
q->rear = q->front = 0;
q->length = 0;
return q;
}
int IsFull(queue q){ //判断队列是否满
if((q->rear+1)%q->maxsize == q->front) return 1;
return 0;
}
int IsEmpty(queue q){ //判断队列是否空
if(q->rear==q->front) return 1;
return 0;
}
void insertqueue(queue q,int n){ //入队
if(IsFull(q)){
printf("队列满");
return;
}
q->data[q->rear] = n;
q->rear = (q->rear+1) % q->maxsize;
++q->length;
}
int deletqueue(queue q){ //出队
if(IsEmpty(q)){
printf("队列空");
return -1;
}
int n = q->data[q->front];
q->front = (q->front+1) % q->maxsize;
--q->length;
printf("%d ",n+1);
return n;
}
(2)bfs实现
void bfstravers(graph gh,int n){
int i;
Adj p;
queue q = createqueue(20);
for(i=0;i<gh->vexnum;i++){
if(visited[i]==0){
visited[i] = 1;
insertqueue(q,i); //入队
while(!IsEmpty(q)){
int n = deletqueue(q); //出队
p = gh->vnode[n].first;
while(p){ //邻接点入队
if(!visited[p->adj]){
visited[p->adj] = 1;
insertqueue(q,p->adj);
}
p = p->next;
}
}
}
}
}