图的存储
邻接表 指针数组 + 多个链表实现存储图
数据类型
#define N 5
#define ADDR_SIZE (sizeof(int *))
typedef int VType;
typedef struct node
{
VType data;
struct node *next;
}GraphList;
typedef GraphList **Graph;
//GraphList *pa[N];//pa 为GraphList **
//Graph pp = pa;
常用操作
1.创建图
Graph create_graph()
{
为指针数组在堆分配空间,GraphList ** g保存指针数组的首地址
为每个顶点分配结点空间(相当于链表头),链表头首地址赋给指针数组的对应元素
g = (GraphList **)malloc(N * ADDR_SIZE);
全部清0
for(i = 0;i < N;i++)
{
g[i] = (GraphList *)malloc(sizeof(GraphList));
g[i]->data = i;
g[i]->next = NULL;
}
}
2.输入弧
int input_arc(Graph g)
{
int i = 0,j = 0;
while(scanf("<V%d,V%d> ",&i,&j) == 2)
{
insert_order_linklist(g[i],j);
}
while(getchar() != '\n');
}
3.输出邻接表
int print_adjlist(Graph g)
{
int i = 0;
for(i = 0;i < N;i++)
{
print_list(g[i]);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
#define ADDR_SIZE (sizeof(int *))
typedef int VType;
typedef struct node
{
VType data;
struct node *next;
}GraphList;
typedef GraphList **Graph;
Graph create_graph()
{
Graph g = NULL;
int i = 0;
g = (GraphList **)malloc(N * ADDR_SIZE);
memset(g,0,N * ADDR_SIZE);
for(i = 0;i < N;i++)
{
g[i] = (GraphList *)malloc(sizeof(GraphList));
g[i]->data = i;
g[i]->next = NULL;
}
return g;
}
int insert_order_list(GraphList *head,VType data)
{
GraphList *temp = NULL;
GraphList *p = head;
temp = (GraphList *)malloc(sizeof(GraphList));
temp->data = data;
while(p->next && p->next->data < data)
{
p = p->next;
}
temp->next = p->next;
p->next = temp;
return 0;
}
int input_arc(Graph g)
{
int i = 0,j = 0;
printf("Input arc like <V0,V1> <V0,V2> ...\n");
while(scanf("<V%d,V%d> ",&i,&j) == 2)
{
//getchar();
insert_order_list(g[i],j);
}
while(getchar() != '\n');
}
int print_list(GraphList *head)
{
GraphList *p = head->next;
while(p)
{
printf("--> V%d ",p->data);
p = p->next;
}
putchar('\n');
return 0;
}
int print_adjlist(Graph g)
{
int i = 0;
for(i = 0;i < N;i++)
{
printf("V%d ",i);
print_list(g[i]);
}
return 0;
}
int main()
{
Graph g = NULL;
g = create_graph();
input_arc(g);
print_adjlist(g);
return 0;
}