C语言实现常用数据结构,C语言实现常用数据结构——图

#include#include

#define SIZE 20

#define LENGTH(a) (sizeof(a)/sizeof(a[0]))

/** 用链表存弧信息,一个存弧指向的顶点位置,第二存指向下条弧的指针,这样就将一个顶点指向的所有弧串起来*/typedefstructenode {intv_index;struct enode *next_edge;

} enode;/** 在顶点存顶点名称和第一条依附顶点的弧*/typedefstructvnode {chardata;

enode*first_edge;

} vnode;/** 用数组存顶点,并加上顶点数和边数共同组成一个图*/typedefstructgraph {intv_num;inte_num;

vnode vs[SIZE];

} graph;/** 返回ch在matrix矩阵中的位置*/

static int get_position(graph g, charch) {inti;for(i=0; i

}

}return -1;

}/** 将enode链接到list的末尾*/

static void link_last(enode *list, enode *node) {

enode*p =list;while(p->next_edge) {

p= p->next_edge;

}

p->next_edge =node;

}/** 创建图*/graph*create_graph() {charc1,c2;char nodes[]= {'A','B','C','D','E','F','G'};char edges[][2] ={

{'A', 'C'},

{'A', 'D'},

{'A', 'F'},

{'B', 'C'},

{'C', 'D'},

{'E', 'G'},

{'F', 'G'},

{'D', 'G'},

{'D', 'B'}

};int v_len=LENGTH(nodes);int e_len=LENGTH(edges);inti,p1,p2;

enode*enode1,*enode2;

graph*pg;/*初始化并分配空间给图指针*/

if ((pg=(graph*)malloc(sizeof(graph))) ==NULL ) {returnNULL;

}

memset(pg,0, sizeof(graph));

pg->v_num =v_len;

pg->e_num =e_len;/*初始化所有顶点*/

for(i=0; iv_num; i++) {

pg->vs[i].data =nodes[i];

pg->vs[i].first_edge =NULL;

}/*初始化所有边,无向图的边为两个顶点共有,按指向顶点来定义可以算两条边,因此要挂在两个顶点的邻接表后面*/

for(i=0; ie_num; i++) {/*获取顶点名*/c1= edges[i][0];

c2= edges[i][1];/*获取顶点在数组中的位置*/p1= get_position(*pg, c1);

p2= get_position(*pg, c2);

enode1= (enode*)malloc(sizeof(enode));

enode1->v_index =p2;/*若边所依附的顶点尚无第一条边,则将这条边赋给顶点的first_edge,否则加在顶点的边链表的最末尾*/

if(pg->vs[p1].first_edge ==NULL) {

pg->vs[p1].first_edge =enode1;

}else{

link_last(pg->vs[p1].first_edge, enode1);

}

enode2= (enode*)malloc(sizeof(enode));

enode2->v_index =p1;if(pg->vs[p2].first_edge ==NULL) {

pg->vs[p2].first_edge =enode2;

}else{

link_last(pg->vs[p2].first_edge, enode2);

}

}returnpg;

}/** 打印邻接表图*/

voidprint_graph(graph g)

{inti,j,k;

enode*node;

printf("List Graph:\n");for (i = 0; i < g.v_num; i++)

{

printf("%d(%c):", i, g.vs[i].data);

node=g.vs[i].first_edge;while (node !=NULL)

{

printf("%d(%c)", node->v_index, g.vs[node->v_index].data);

node= node->next_edge;

}

printf("\n");

}

}

main() {/*创建图,并打印图*/graph*pg =create_graph();

print_graph(*pg);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值