一 图的存储----邻接矩阵
2.操作
二 图的存储----邻接表 [将顶点和它存在边的顶点用链表链接]
1.节点的数据结构
2.创建一个空的邻接表
代码如下:
adilist.c
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;
}