图的邻接表
来源:互联网 发布:ios开发需要学linux 编辑:程序博客网 时间:2024/05/20 00:37
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define MAX 100struct ArcNode //边节点 { int adjvex; ArcNode *nextarc;};struct VNode{ int data; ArcNode *head1; //入边的表头指针 ArcNode *head2; //出边的表头指针 };struct LGraph{ VNode vertexs[MAX]; //顶点数组 int vexnum, arcnum; //顶点数和边数 };LGraph lg;void CreateLG(){ int i = 0; ArcNode *pi; int v1, v2; lg.vexnum = lg.arcnum = 0; scanf( "%d%d", &lg.vexnum, &lg.arcnum ); for( i = 0; i < lg.vexnum; i++ ) //初始化 lg.vertexs[i].head1 = lg.vertexs[i].head2 = NULL; for( i = 0; i < lg.arcnum; i++ ) //邻接表的插入 { scanf( "%d%d", &v1, &v2 ); v1--; v2--; pi = (ArcNode *)malloc( sizeof(ArcNode) ); pi->adjvex = v2; pi->nextarc = lg.vertexs[v1].head1; lg.vertexs[v1].head1 = pi; pi = (ArcNode *)malloc( sizeof(ArcNode) ); pi->adjvex = v1; pi->nextarc = lg.vertexs[v2].head2; lg.vertexs[v2].head2 = pi; }}void DeleteLG() //删除邻接表 { int i; ArcNode *pi; for( i = 0; i < lg.vexnum; i++ ) { pi = lg.vertexs[i].head1; while( pi != NULL ) { lg.vertexs[i].head1 = pi->nextarc; free( pi ); pi = lg.vertexs[i].head1; } pi = lg.vertexs[i].head2; while( pi != NULL ) { lg.vertexs[i].head2 = pi->nextarc; free( pi ); pi = lg.vertexs[i].head2; } }}int main() //主函数 { int i; int id, od; ArcNode *pi; while( 1 ) { lg.vexnum = lg.arcnum = 0; scanf( "%d%d", &lg.vexnum, &lg.arcnum ); if( lg.vexnum == 0 ) break; CreateLG( ); for( i = 0; i < lg.vexnum; i++ ) { od = 0; pi = lg.vertexs[i].head1; while( pi != NULL ) { od++; pi = pi->nextarc; } if( i == 0 ) printf( "%d", od ); else printf( " %d", od ); } printf( "\n" ); for( i = 0; i < lg.vexnum; i++ ) { id = 0; pi = lg.vertexs[i].head2; while( pi != NULL ) { id++; pi = pi->nextarc; } if( i == 0 ) printf( "%d", id ); else printf( " %d", id ); } printf( "\n" ); DeleteLG(); } return 0;}