// 图的链接表存储.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
typedef struct node* pointer;
const int num = 100;
int visited[num];//访问标志数组
struct node//表结点
{
int no;
node *next;
};
typedef struct //表头结点
{
int data;
pointer first;//指向链表中第一个结点
}HeadType;
typedef struct
{
HeadType adjlist[num];
int n,e;
}lk_graph;
void create(lk_graph *g)//无向图邻接表的实现
{
int i,j;
pointer p;
cout<<"请输入顶点数和边数:";
cin>>g->n>>g->e;
cout<<"请输入顶点编号:";
for (int i = 0; i < g->n; i++)//这里实现的是读入顶点,建立顶点表
{
cin>>g->adjlist[i].data;
g->adjlist[i].first = NULL;
}
for(int k = 0; k < g->e; k++)
{
cout<<"请输入第"<<k + 1<<"对顶点对:";
//首先让第i个表中链接顶点j,
cin>>i>>j;
p = new node;
p->no = j;
p->next = g->adjlist[i].first;
g->adjlist[i].first = p;
//然后让第j个表中链接顶点i
p = new node;
p->no = i;
p->next = g->adjlist[j].first;
g->adjlist[j].first = p;
cout<<endl;
}
}
void display(lk_graph* g)//输出图结构
{
for (int i = 0; i < g->n; i++)
{
cout<<i;
node *p = g->adjlist[i].first;//找到一个表,把它的邻接点全部书出来
while (p != NULL)
{
cout<<"->"<<p->no;
p = p->next;
}
cout<<endl;
}
}
void DFS(lk_graph *g,int v)//从编号为v的结点深度搜索
{
node *p;
visited[v] = 1;
cout<<v<<" ";
p = g->adjlist[v].first;//指向顶点弧的第一条弧的弧头结点
while(p != NULL)
{
if(visited[p->no] == 0)//如果下一个链接的v顶点没被访问过
{
DFS(g,p->no);//往下访问下一个链接的v顶点
}
p = p->next;//访问顶点v的下一条弧
}
}
void BFS(lk_graph* g, int v)//从编号为v的结点广度搜索
{
for (int i = 0; i < g->n; i++)
{
visited[i] = 0;//访问之前所有结点初始化没访问
}
cout<<v<<" ";//访问当前结点
visited[v] = 1;
int queue[num];
int front,rear;
front = rear = 0;
rear = ( rear + 1) % num;
queue[rear] = v;//将当前结点进队;
int w;
node *p;
while(front != rear)
{
front = (front + 1) % num;
w = queue[front];
p = g->adjlist[w].first;
while(p != NULL)
{
if(visited[p->no] == 0)//若邻接点没被访问
{
cout<<p->no<<" ";
visited[p->no] = 1;//设置当前结点已经被访问
rear = (rear + 1) % num;
queue[rear] = p->no;//将当前结点入队
}
p = p->next;//搜索下一个邻接结点
}
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
//cout<<"ddd"<<endl;
lk_graph *g = new lk_graph;
create(g);
cout<<"图的结构为:"<<endl;
display(g);
cout<<"图的广度搜索为"<<endl;
BFS(g,0);
for (int i = 0; i < g->n; i++)//恢复原状
{
visited[i] = 0;
}
cout<<"深度搜索顺序为:"<<endl;
DFS(g,0);
return 0;
}