邻接表

初学者。如果有误请指正,欢迎联系QQ2684162190

#include<stdio.h>
#include<stdlib.h>

typedef int VertexType;
typedef int EdgeType;

#define MAXVEX 100
#define INFINITY 65535
typedef int Boolean;
Boolean visited[MAXVEX];
#define MAXSIZE 100

typedef struct EdgeNode		//边表节点 
{
	int adjvex;			//邻接点域,储存该顶点对应的下标 
	struct EdgeNode* next; 
}EdgeNode;				//链域,指向下一个邻接点 

typedef struct VertexNode		//顶点表节点 
{
	VertexType date;			//顶点域 
	EdgeNode *firstedge; 		//边表头指针 
}VertexNode,AdjList[MAXVEX];
//循环队列的顺序储存结构  
typedef struct 
{
	int date[MAXSIZE];
	int front;
	int rear;
}SqQueue;
typedef struct
{
	AdjList adjlist;
	int numVertexes,numEdges; 		//图中当前定点数和边数 
}GraphAdjList;

//图邻接表的建立
void CreateALGraph(GraphAdjList *G)
{
//	int i,j,k;
//	EdgeNode *e;
//	printf("输入顶点数和边数\n");
//	scanf("%d%d",&G->numVertexes,&G->numEdges);
//	printf("输入顶点数据:\n");
//	for(i = 0;i < G->numVertexes;i++)			//建立顶点表 
//	{
//		getchar();
//		scanf("%c",&G->adjlist[i].date);
//		G->adjlist[i].firstedge = NULL;
//	}
//	for(k = 0;k < G->numEdges;k++)
//	{
//		printf("输入边(vi,vj)上的顶点序号:\n");		//输入边(vi,vj)边的顶点序号 
//		scanf("%d%d",&i,&j);							//申请空间,生成边表节点 
//		e = (EdgeNode*)malloc(sizeof(EdgeNode));
//		e->adjvex = j;									//邻接序号为J 
//		e->next = G->adjlist[i].firstedge;				//将指针e指向当前顶点指向的节点 
//		G->adjlist[i].firstedge = e;					//将当前顶点指向e 
//		e = (EdgeNode*)malloc(sizeof(EdgeNode));		//邻接序号为i 
//		e->adjvex = i;
//		e->next = G->adjlist[i].firstedge;
//		G->adjlist[i].firstedge = e;
//	}
	int i,j,k;
	EdgeNode *e;
	G->numVertexes = 10;
	G->numEdges = 12;
	for(i = 0;i < G->numVertexes;i++)			//建立顶点表 
	{
		G->adjlist[i].date = i;
		G->adjlist[i].firstedge = NULL;
	} 
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 8;e->next = G->adjlist[0].firstedge;G->adjlist[0].firstedge = e;
						
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 0;e->next = G->adjlist[8].firstedge;G->adjlist[8].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 2;e->next = G->adjlist[8].firstedge;G->adjlist[8].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 9;e->next = G->adjlist[8].firstedge;G->adjlist[8].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 8;e->next = G->adjlist[2].firstedge;G->adjlist[2].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[2].firstedge;G->adjlist[2].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 4;e->next = G->adjlist[2].firstedge;G->adjlist[2].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 8;e->next = G->adjlist[9].firstedge;G->adjlist[9].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[9].firstedge;G->adjlist[9].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 2;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 9;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 3;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 7;e->next = G->adjlist[1].firstedge;G->adjlist[1].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 2;e->next = G->adjlist[4].firstedge;G->adjlist[4].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 3;e->next = G->adjlist[4].firstedge;G->adjlist[4].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[3].firstedge;G->adjlist[3].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 4;e->next = G->adjlist[3].firstedge;G->adjlist[3].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 5;e->next = G->adjlist[3].firstedge;G->adjlist[3].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 1;e->next = G->adjlist[7].firstedge;G->adjlist[7].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 6;e->next = G->adjlist[7].firstedge;G->adjlist[7].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 7;e->next = G->adjlist[6].firstedge;G->adjlist[6].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 5;e->next = G->adjlist[6].firstedge;G->adjlist[6].firstedge = e;
	
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 6;e->next = G->adjlist[5].firstedge;G->adjlist[5].firstedge = e;
	e = (EdgeNode*)malloc(sizeof(EdgeNode));e->adjvex = 3;e->next = G->adjlist[5].firstedge;G->adjlist[5].firstedge = e;
}
//邻接表的深度优先算法 
void DFS(GraphAdjList* GL,int i)
{
	EdgeNode* p;
	visited[i] = 1;
	printf("%d ",GL->adjlist[i].date);
	p = GL->adjlist[i].firstedge;
	while(p)
	{
		if(!visited[p->adjvex])
			DFS(GL,p->adjvex);
		p = p->next;
	}
}

void DFSTraverse(GraphAdjList* GL)
{
	int i;
	for(i = 0;i < GL->numVertexes;i++)
		visited[i] = 0;
	for(i = 0;i < GL->numVertexes;i++)
		if(!visited[i])
			DFS(GL,i);
}
//初始化一个空队列 
int InitQueue(SqQueue *Q)
{
	Q->front=0;
	Q->rear=0;
	return 1;
}

//返回Q元素个数,也就是队列长度
int QueueLength(SqQueue Q)
{
	return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

//若队列未满,则插入e为新的队尾元素 
int EnQueue(SqQueue *Q,int e)
{
	if((Q->rear+1)%MAXSIZE==Q->front) //队列已满的判断 
		return 0;						//当队列front与rear相差一个位置时记队列为满 
	Q->date[Q->rear]=e;
	Q->rear=(Q->rear+1)%MAXSIZE;
	return 1;				//rear指针后移一位,若到队尾则移到队列头部 
}

//若队列不空,则删除Q中队头元素,并用E返回他的值
int DeQueue(SqQueue *Q,int *e)
{
	if(Q->front==Q->rear)  			//队列为空的判断 
		return 0;
	*e = Q->date[Q->front];
	Q->front=(Q->front+1)%MAXSIZE; 	//front 指针后移如果是在队尾则转到数组头部 
	return 1;
} 

//将队列清空
void ClearQueue(SqQueue *Q)
{
	Q->front=0;
	Q->rear=0;	
}

//队列存在则将他销毁
int DestoryQueue(SqQueue *Q)
{
	free(Q);
	return 1;
}

//若队列为空返回1否则返回0
int QueueEmpty(SqQueue Q)
{
	if(Q.rear==Q.front)
		return 1;
	return 0;
}
void BFSTraverse(GraphAdjList* GL)
{
	int i,j;
	EdgeNode *p;
	SqQueue Q;
	for(i = 0;i < GL->numVertexes;i++)
		visited[i] = 0;
	InitQueue(&Q);
	for(i = 0;i < GL->numVertexes;i++)
	{
		if(!visited[i])
		{
			visited[i] = 1;
			printf("%d ",GL->adjlist[i].date);
			EnQueue(&Q,i);
			while(!QueueEmpty(Q))
			{
				DeQueue(&Q,&j);
				p = GL->adjlist[j].firstedge;
				while(p)
				{
					if(!visited[p->adjvex])
					{
						visited[p->adjvex] = 1;
						printf("%d ",GL->adjlist[p->adjvex].date);
						EnQueue(&Q,p->adjvex);
					}
					p = p->next;
				}
			}
		}
	}
}
int main()
{
	GraphAdjList* G = (GraphAdjList*)malloc(sizeof(GraphAdjList)); 
	CreateALGraph(G);
	printf("深度优先遍历算法:");
	DFSTraverse(G);
	printf("\n广度优先遍历算法:");
	BFSTraverse(G);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值