数据结构C语言版之邻接表(各种遍历)
//邻接表:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define Stack_size 100
#define Stackincreament 10
#define MAX_VERTE_NUM 20
int visited[MAX_VERTE_NUM];
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextArc;
}ArcNode,*N;
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTE_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
int Location(ALGraph ALG,char v)
{
for(int i=0;i<ALG.vexnum;i++)
if(ALG.vertices[i].data==v)
return i;
return -1;
}
void CreatALGraph(ALGraph &ALG)
{
int i,m,n;
char v1,v2;
printf("请输入图的顶点数和边数:\n");
scanf("%d",&ALG.vexnum);
scanf("%d",&ALG.arcnum);
getchar();
printf("请输入各个顶点:\n");
for(i=0;i<ALG.vexnum;i++)
{
scanf("%c",&ALG.vertices[i].data);
ALG.vertices[i].firstarc=NULL;
}
printf("请输入图的各边:\n");
getchar();
for(i=0;i<ALG.arcnum;i++)
{
ArcNode *p,*s;
scanf("%c%c",&v1,&v2);
getchar();
m=Location(ALG,v1);
n=Location(ALG,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=n;
p->nextArc=NULL;
if(!ALG.vertices[m].firstarc)
ALG.vertices[m].firstarc=p;
else
{
ArcNode *q;
q=ALG.vertices[m].firstarc;
while(q->nextArc)
q=q->nextArc;
q->nextArc=p;
}
s=(ArcNode*)malloc(sizeof(ArcNode));
s->adjvex=m;
s->nextArc=NULL;
if(!ALG.vertices[n].firstarc)
ALG.vertices[n].firstarc=s;
else
{
ArcNode *r;
r=ALG.vertices[m].firstarc;
while(r->nextArc)
r=r->nextArc;
r->nextArc=s;
}
}
}
void DFS(ALGraph G,int v)
{
ArcNode *w;
visited[v]=1;
printf("%c",G.vertices[v]);
for(w=G.vertices[v].firstarc;w;w=w->nextArc)
if(!visited[w->adjvex])
DFS(G,w->adjvex);
}
void DFStraverse(ALGraph G)
{//深度优先遍历的递归算法
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v);
}
/*typedef struct{
ArcNode *base;
int top;
int stacksize;
}sqstack;
void initstack(sqstack &s)
{
s.base=(N)malloc(Stack_size*sizeof(ArcNode));
s.stacksize=Stack_size;
if(!s.base)
exit(0);
s.top=0;
}
int stackempty(sqstack s)
{
if(s.top==0)
return 1;
return 0;
}
void push(sqstack &s,N e)
{
if(s.top>=s.stacksize)
{
s.base=(N)realloc(s.base,(Stack_size+Stackincreament)*sizeof(ArcNode));
if(!s.base)
exit(0);
s.stacksize+=Stackincreament;
}
s.base[s.top++]=e;
}
void pop(sqstack &s,N e)
{
if(s.top==0)
return ;
e=s.base[--s.top];
}
void DFS(ALGraph G,int v)
{
ArcNode *p;
sqstack s;
visited[v]=1;
printf("%c",G.vertices[v].data);
p=G.vertices[v].firstarc;
initstack(s);
while(!stackempty(s) || p)
{
while(p)
{
if(visited[p->adjvex]==1)
{
p=p->nextArc;
}
else
{
printf("%c",G.vertices[p->adjvex].data);
visited[p->adjvex]=1;
push(s,p);
p=G.vertices[p->adjvex].firstarc;
}
}
if(!stackempty(s))
{
pop(s,p); p=p->nextArc;
}
}
}
*/
typedef struct{
int *data;
int front;
int rear;
}SqQueue;
void InitQueue(SqQueue &Q)
{
Q.data=(int*)malloc(MAX*sizeof(int));
Q.front=Q.rear=0;
}
int QueueEmpty(SqQueue Q)
{
if(Q.rear==Q.front)
return 1;
return 0;
}
void EnQueue(SqQueue &Q,int e)
{
if((Q.rear%MAX)>=Q.front)
return;
else
{
Q.data[Q.rear]=e;
Q.rear=(Q.rear+1)%MAX;
}
}
void DeQueue(SqQueue &Q,int &e)
{
if(QueueEmpty(Q))
return;
e=Q.data[Q.front];
Q.front=(Q.front+1)%MAX;
}
void BFSTraverse(ALGraph G)
{
int u,v;
ArcNode *p;
SqQueue Q;
InitQueue(Q);
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
{
if(!visited[v])
{
printf("%c",G.vertices[v].data);
EnQueue(Q,v);
visited[v]=1;
while(!QueueEmpty(Q))
{
DeQueue(Q,u);
for(p=G.vertices[u].firstarc;p;p=p->nextArc)
{
if(!visited[p->adjvex])
{
printf("%c",G.vertices[p->adjvex].data);
visited[p->adjvex]=1;
EnQueue(Q,p->adjvex);
}
}
}
}
}
printf("\n");
}
int main()
{
ALGraph ALG;
CreatALGraph(ALG);
DFStraverse(ALG);
printf("\n");
BFSTraverse(ALG);
return 0;
}
不为失败找原因,要为成功找方法!
浙公网安备 33010602011771号