//邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)
//每个链表中的节点有三个域组成:邻接点域(adjvex),链域(nextarc),数据域(info)
//每个链表附设一个表头节点。表头节点只有链域(firstarc)和数据域(data)
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < limits.h >#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2typedef int Status ;
//-------------------------图的邻接表存储表示-------------------------------//
//#define INFINITY INT_MAX //最大值(无穷大)INT_MAX = 2147483647
#define MAX_VERTEX_NUM 20 //最大顶点个数(vertex顶点)
//#define MAX_INFO 20 //关于边的信息的字符串长度
#define MAX_NAME 5 //关于顶点信息的字符串长度typedef int VRType ; //此处考虑无权图
typedef int InfoType ; //如果为字符信息,则可以用char;如果为权值,则可以用int.
//typedef char* VertexType ;
typedef char VertexType[ MAX_NAME ]; //VertexType可以根据实际情况灵活设定类型!int,float,char…
typedef enum{ DG , DN , UDG , UDN }GrapKind ; //{有向图(Digraph),有向网(Digraph Network), 无向图(Undigraph),无向网(Undigraph Network)}typedef struct ArcNode{ //表结点
int adjvex ; //该弧所指向的顶点的位置
struct ArcNode *nextarc ; //指向下一条弧的指针
InfoType *info ; //该弧相关信息指针(如权值等)
} ArcNode ;typedef struct VNode { //表头结点
VertexType data ; //顶点信息
ArcNode *firstarc ; //指向第一条依附该顶点的弧的指针
} VNode , AdjList[ MAX_VERTEX_NUM ] ;typedef struct {
AdjList vertices ;
int vexnum , arcnum ; //图当前的顶点树和弧数
GrapKind kind ;
} ALGraph ;//----------------------------------------------------------------//
//有时,为了便于确定顶点的入度或以顶点vi为头的弧,可以建立一个有向图的逆邻接表,既对每个顶点vi建立一个链表以vi为头的弧的表(只适合有向图)
//若无向图中有n个顶点,e条边,则它的邻接表需n个头节点和2e个表结点。显然,在边稀疏(e << n(n-1)/2 )的情况下,用邻接表表示图比邻接矩阵节省存储空间
//-------------------------Link Queue---------------------------//typedef int QElemType ;
typedef struct QNode //链结点
{
QElemType data ;
struct QNode *next ;
} QNode , *QueuePtr ;typedef struct
{
QueuePtr front ; //队头指针 队头出元素
QueuePtr rear ; //队尾指针 队尾进元素
} LinkQueue ;Status InitQueue( LinkQueue *Q ) ;
Status EnQueue( LinkQueue *Q , QElemType e ) ;
Status DeQueue( LinkQueue *Q , QElemType *e ) ;
Status QueueEmpty( LinkQueue Q ) ;//-------------------------------------------------------------//
//--------------------------------------------------------------//
Status InitGraph( ALGraph *G )
{
int i ;printf( "Please input the number of vex and arc:" ) ;
scanf( "%d%d" , &( *G ).vexnum , &( *G ).arcnum ) ;printf( "Please input the kind of ALGraph(0 means DG ) :" ) ;
scanf( "%d" , &( *G ).kind ) ;printf("Input the vector of %d vex( %d char ): \n" , ( *G ).vexnum , MAX_NAME ) ;
for( i = 0 ; i < ( *G ).vexnum ; ++ i ) //构造顶点向量,同时也初始化表头结点数组。
{
scanf( "%s" , ( *G ).vertices[ i ].data ) ;
( *G ).vertices[ i ].firstarc = NULL ;
}return OK ;
}Status LocateVex( ALGraph G , VertexType u )
{
int k ;for( k = 0 ; k < G.vexnum ; ++ k )
{
if( strcmp( u , G.vertices[ k ].data ) == 0 )
return k ;
}
return EOF ;
}Status CreateGraph( ALGraph *G )
{
第七章(2).图的邻接表存储表示
最新推荐文章于 2022-04-24 20:47:58 发布
//邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)//每个链表中的节点有三个域组成:邻接点域(adjvex),链域(nextarc),数据域(info)//每个链表附设一个表头节点。表头节点只有链域(firstarc)和数据域(data)#include #include #include #include #define TRU
摘要由CSDN通过智能技术生成