#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef int DataType;
int visited[MAX+1];
typedef struct node
{
int adjvex;
struct node *next;
int info;
} EdgeNode;
typedef struct
{
int vertex;
EdgeNode *firstedge;
} VertexNode;
typedef VertexNode AdjList[MAX+1];
typedef struct
{
AdjList adjlist;
int n,e;
} ALGraph;
typedef struct
{
DataType Qdata[MAX+1];
int front,rear;
} SeqQueue;
void CreatesAdjList(ALGraph *g)
{
int n,m;
printf("请输入顶点数和边数:");
scanf("%d%d",&n,&m);
g->n=n;
g->e=m;
EdgeNode *ptr1,*ptr2;
int k,v1,v2;
printf("请输入顶点元素:\n");
for(k=1; k<=g->n; k++)
{
getchar();
scanf("%d",&(g->adjlist[k].vertex));
g->adjlist[k].firstedge=NULL;
}
printf("请输入一条边的起终点对应的序号与权值:\n");
for(k=1; k<=g->e; k++)
{
//printf("请输入一条边的起终点对应的序号:\n");
scanf("%d%d",&v1,&v2);
ptr1=(EdgeNode*)malloc(sizeof(EdgeNode));
ptr1->adjvex=v2;
int num;
//printf("请输入这条边的权值:\n");
scanf("%d",&num);
ptr1->info=num;
ptr1->next=g->adjlist[v1].firstedge;
g->adjlist[v1].firstedge=ptr1;
ptr2=(EdgeNode*)malloc(sizeof(EdgeNode));
ptr2->adjvex=v1;
ptr2->info=num;
ptr2->next=g->adjlist[v2].firstedge;
g->adjlist[v2].firstedge=ptr2;
}
}
void Search(ALGraph *g)
{
int x,y=0;
printf("请输入你需要查找节点的名称:\n");
scanf("%d",&x);
for(int i=1; i<=g->n; i++)
visited[i]=0;
for(int i=1; i<g->n; i++)
{
if(!visited[i])
{
SFS(g,i,x);
y++;
}
}
if(y==0)
printf("\n图没有这个节点!\n");
}
void SFS(ALGraph *g,int i,int x)
{
visited[i]=1;
EdgeNode *p;
if(g->adjlist[i].vertex==x)
{
printf("***%3d",g->adjlist[i].vertex);
return;
}
p=g->adjlist[i].firstedge;
while(p!=NULL)
{
if(visited[p->adjvex]!=1)
DFS(g,p->adjvex);
p=p->next;
}
}
void DFS(ALGraph g,int i)
{
visited[i]=1;
EdgeNode *p;
printf("%3d",g.adjlist[i].vertex);
p=g.adjlist[i].firstedge;
while(p!=NULL)
{
if(visited[p->adjvex]!=1)
DFS(g,p->adjvex);
p=p->next;
}
}
void DFSTraverse(ALGraph g)
{
int i;
for(i=1; i<=g.n; i++)
visited[i]=0;
for(i=1; i<=g.n; i++)
if(!visited[i])
DFS(g,i);
}
void InitQueue(SeqQueue *q)
{
q->front=q->rear=0;
}
int QueueEmpty(SeqQueue *q)
{
if(q->front==q->rear)
return 1;
else
return 0;
}
int EnQueue(SeqQueue *q,DataType x)
{
if(q->rear==MAX+1)
{
printf("队列已满!\n");
return 0;
}
else
{
q->Qdata[q->rear]=x;
q->rear++;
return 1;
}
}
int DeQueue(SeqQueue *q,DataType *x)
{
if(q->rear==q->front)
{
printf("队列已空!\n");
return 0;
}
else
{
*x=q->Qdata[q->front];
q->front++;
return 1;
}
}
int GetQueue(SeqQueue *q,DataType *x)
{
if(q->rear==q->front)
{
printf("队列已空!\n");
return 0;
}
else
{
*x=q->Qdata[q->front];
return 1;
}
}
void BFS(ALGraph *g,int v)
{
SeqQueue q;
EdgeNode *p;
InitQueue(&q);
visited[v]=1;
printf("%3d",g->adjlist[v].vertex);
EnQueue(&q,v);
while(!QueueEmpty(&q))
{
DeQueue(&q,&v);
p=g->adjlist[v].firstedge;
while(p!=NULL)
{
if(!visited[p->adjvex])
{
int x;
x=p->adjvex;
visited[p->adjvex]=1;
printf("%3d",g->adjlist[x].vertex);
EnQueue(&q,p->adjvex);
}
p=p->next;
}
}
}
int main()
{
ALGraph *g;
g=(ALGraph*)malloc(sizeof(ALGraph));
CreatesAdjList(g);
printf("\nDFS的遍历结果:\n");
DFSTraverse(*g);
printf("\nBFS的遍历结果:\n");
for(int x=0; x<=g->n; x++)
visited[x]=0;
for(int x=1; x<=g->n; x++)
if(visited[x]==0)
{
BFS(g,x);
}
printf("\n");
Search(g);
printf("\n");
system("pause");
return 0;
}
eg
这个节点为7,边为12
输入节点 1 2 3 4 5 6 7
节点和边的权值
```
1
2
1
1
4
1
1
3
1
1
6
1
2
4
1
2
7
1
2
5
1
3
6
1
4
6
1
4
7
1
6
7
1
5
7
1```