图的存储(5.20)

一 图的存储----邻接矩阵


1.数据结构

typedef struct 
{
	int v[N];
	int matrix[N][N];
}graph_t;

2.操作

graph_t *malloc_graph_memory()
{
	int i = 0;
	graph_t *g;

	g = (graph_t *)malloc(sizeof(graph_t));
	
	for(i = 0;i < N;i ++)
	{
		g->v[i] = i;
	}

	return g;
}

int input_graph_edge(graph_t *g)
{
	int i,j;

	//(V0,V1) (V0,V2) ....a回车 
	while(scanf("(V%d,V%d)",&i,&j) == 2)
	{
		getchar();//吃掉用户输入的空格
		g->matrix[i][j] = g->matrix[j][i] = 1;
	}

	//清除用户输入的非法字符
	while( getchar() != '\n');
	
	return 0;
}

//输出顶点和邻接矩阵
int printf_graph(graph_t *g);

二 图的存储----邻接表 [将顶点和它存在边的顶点用链表链接]


1.节点的数据结构

typedef struct vnode
{
	DATATYPE v;
	struct vnode *next;
}LinkNode;

2.创建一个空的邻接表

LinkNode **create_empty_adjlist(int n)
{
	LinkNode **G;

	G =(LinkNode **)malloc(ADDR_LEN * n);

	for(i = 0;i < n;i ++)
	{
		//G[i] <=> *(G + i)
		G[i]= (LinkNode *)malloc(sizeof(LinkNode));
		G[i]->v = i;
		G[i]->next = NULL;
	}

	return G;
}

int input_graph_edge(LinkNode **G)
{
	int i,j;

	//<V0,V1> <V0,V2> ... a
	while(scanf("<V%d,V%d>",&i,&j) == 2)
	{
		getchar();
		insert_order_linklist(G[i],j);
	}
	while(getchar() != '\n');

	return 0;
}

int printf_adjlist(LinkNode **G);

int main()
{
	LinkNode **G = create_empty_adjlist(5);

	input_graph_edge(G);
	
	return 0;
}

代码如下:

graph.c

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

#define N 5

typedef struct 
{
	int v[N];
	int matrix[N][N];
}graph_t;

graph_t *malloc_graph_memory()
{
	int i = 0;
	graph_t *g;

	g = (graph_t *)malloc(sizeof(graph_t));
	bzero(g,sizeof(graph_t));
	
	for(i = 0;i < N;i ++)
	{
		g->v[i] = i;
	}

	return g;
}

int input_graph_edge(graph_t *g)
{
	int i,j;

	//(V0,V1) (V0,V2) ....a回车 
	while(scanf("(V%d,V%d)",&i,&j) == 2)
	{
		getchar();//吃掉用户输入的空格
		g->matrix[i][j] = g->matrix[j][i] = 1;
	}

	//清除用户输入的非法字符
	while( getchar() != '\n');
	
	return 0;
}

//输出顶点和邻接矩阵
int printf_graph(graph_t *g)
{
	int i = 0;
	int j = 0;

	for(i = 0;i < N;i ++)
	{
		printf("V%d ",g->v[i]);
	}
	printf("\n");
	
	for(i = 0;i < N;i ++)
	{
		for(j = 0;j < N;j ++)
		{
			printf("%d ",g->matrix[i][j]);
		}
		printf("\n");
	}

	return 0;
}

int main(int argc, const char *argv[])
{
	graph_t *g = malloc_graph_memory();

	input_graph_edge(g);

	printf_graph(g);
	
	return 0;
}

adilist.c

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

#define N 5
#define ADDR_LEN 4

typedef int DATATYPE;

typedef struct vnode
{
	DATATYPE v;
	struct vnode *next;
}LinkNode;

LinkNode **create_empty_adjlist(int n)
{
	int i;
	LinkNode **G;

	G =(LinkNode **)malloc(ADDR_LEN * n);

	for(i = 0;i < n;i ++)
	{
		//G[i] <=> *(G + i)
		G[i]= (LinkNode *)malloc(sizeof(LinkNode));
		G[i]->v = i;
		G[i]->next = NULL;
	}

	return G;
}

int insert_order_linklist(LinkNode *head,DATATYPE v)
{   
	LinkNode *temp;
	LinkNode *p,*q;

	//  q  p
	//1 3  6
	//   5
	for(p = head->next,q = head;p != NULL;p = p->next,q = q->next)
	{
		if(p->v > v)
			break;
	}
	
	temp = (LinkNode *)malloc(sizeof(LinkNode));
	temp->v = v;

	temp->next = p;//temp->next = q->next;
	q->next    = temp;

	return 0;
}

int input_graph_edge(LinkNode **G)
{
	int i,j;

	//<V0,V1> <V0,V2> ... a
	while(scanf("<V%d,V%d>",&i,&j) == 2)
	{
		getchar();
		insert_order_linklist(G[i],j);
	}
	while(getchar() != '\n');

	return 0;
}

int printf_linklist(LinkNode *head)
{
	LinkNode *p;

	for(p = head->next; p != NULL; p = p->next)
	{
		printf("V%d ",p->v);
	}
	printf("\n");

	return 0;
}

int printf_adjlist(LinkNode **G)
{
	int i = 0;

	for(i = 0;i < N;i ++)
	{
		printf("V%d : ",G[i]->v);
		printf_linklist(G[i]);
	}

	return 0;
}

int main()
{
	LinkNode **G = create_empty_adjlist(5);

	input_graph_edge(G);
	
	printf_adjlist(G);

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值