数据结构——图整理代码(邻接表存储图)

数据结构图相关代码整理记录——邻接表存储图

环境CodeBlocks17 运行通过

#include 
#include 
#include 
#include 
using namespace std;

#define MAX_VERTEX_NUM 20
typedef char VertexType;    // 顶点数据类型
typedef char InfoArc;   // 弧节点相关信息
typedef enum {DG,DN,UDG,UDN} GraphKind;//图类型{有向图,有向网,无向图,无向网}   (边带权值的图叫网)
typedef struct ArcNode  // 弧节点
{
    int adjvex; // 该弧所指向的顶点在数组中的位置
    int value;  // 弧的权值
    struct ArcNode *nextarcs;   // 指向下一条弧的指针
    InfoArc *info;  // 该弧相关信息的指针
}ArcNode;
typedef struct VNode    // 顶点
{
    VertexType data;    // 顶点信息
    ArcNode *firstarc;  // 指向第一条依附于该顶点的弧的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct  // 图结构
{
    AdjList vertices;    // 指向订点链表的指针
    int vexnum, arcnum; // 图的当前顶点和弧数
    GraphKind kind;   // 图的种类标志DG,DN,UDG,UDN
}ALGraph;

int visited[MAX_VERTEX_NUM];    // 访问记录数组
int indegree[MAX_VERTEX_NUM];   // 入度记录数组

void CreatGraph_DN(ALGraph &G)
{// 创建有向图
    ArcNode *p,*q;
    int i,j,flag1,flag2,value;  // value 接收输入的权值
    VNode v1,v2;
    G.kind = DN;    // 规定为有向图

    // 输入该有向网的顶点数目和弧的数目
    scanf("%d%d",&G.vexnum,&G.arcnum);getchar();
    // 初始化顶点
    for(i=0;inextarcs = NULL;
            p->adjvex = flag2;
            //  没有权值 p->value==?
            q = G.vertices[flag1].firstarc;
            if(q == NULL)   // 弧链表为空
                G.vertices[flag1].firstarc = p;
            else    // 弧链表不为空,接到表尾
            {
                /*
                while(q->nextarcs!=NULL)
                    q = q->nextarcs;
                q->nextarcs = p;
                */
                //方法二插到表头后面
                p->nextarcs = G.vertices[flag1].firstarc;
                G.vertices[flag1].firstarc = p;
            }
        }
    }
}

void CreatGraph_UDG(ALGraph &G)
{// 创建邻接表存储的无向图G
    ArcNode *p,*q;
    int i,j,flag1,flag2;
    VNode v1,v2;
    G.kind = UDG;    // 规定为无向图

    // 输入该有向网的顶点数目和弧的数目
    scanf("%d%d",&G.vexnum,&G.arcnum);getchar();
    // 初始化顶点
    for(i=0;inextarcs = NULL;
            p->adjvex = flag2;
            //  没有权值 p->value==?
            q = G.vertices[flag1].firstarc;
            if(q == NULL)   // 弧链表为空
                G.vertices[flag1].firstarc = p;
            else    // 弧链表不为空,插入到表中
            {
                // 方法一 插入到表尾
                /*
                while(q->nextarcs!=NULL)
                    q = q->nextarcs;
                q->nextarcs = p;
                */
                //方法二插到表头后面
                p->nextarcs = G.vertices[flag1].firstarc;
                G.vertices[flag1].firstarc = p;
            }
            //------------------------------
            p = (ArcNode *)malloc(sizeof(ArcNode));
            p->nextarcs = NULL;
            p->adjvex = flag1;
            // DN 没有权值 p->value==?
            q = G.vertices[flag2].firstarc;
            if(q == NULL)   // 弧链表为空
                G.vertices[flag2].firstarc = p;
            else    // 弧链表不为空,插入到表中
            {
                // 方法一 插入到表尾
                /*
                while(q->nextarcs!=NULL)
                    q = q->nextarcs;
                q->nextarcs = p;
                */
                //方法二插到表头后面
                p->nextarcs = G.vertices[flag2].firstarc;
                G.vertices[flag2].firstarc = p;
            }
        }
    }
}


void CountVerNum_DN(ALGraph &G, int *D, int *ID, int* OD)
{//计算各结点的度
	//邻接表存储的有向网,当计算顶点的度时,出度为顶点链表中弧表结点的数目
	//入度则需遍历整个邻接表求得相应的顶点的入度,然后与出度相加得到个顶点的度
    int i;
    ArcNode *p;
    for(i=0;iadjvex]++;
                    p = p->nextarcs;
                }
    }
    for(i=0;iadjvex);
            p = p->nextarcs;
        }
        printf("\n");
    }
}

//--------------------------------------------------
int FirstAdjVex(ALGraph &G, int v)
{// 返回表示第v个节点的第一个邻接点的数组下标
    if(G.vertices[v].firstarc==NULL)    // 下个节点不存在
        return -1;
    else    // 下个节点存在
        return G.vertices[v].firstarc->adjvex;
}
int NextAdjVex(ALGraph &G, int v, int w)
{// 返回图G中v的邻接链表中边data值为w的下一个节点的数组下表
    ArcNode *p = G.vertices[v].firstarc;
    while(p->adjvex!=w) // 查找v的弧链表上的w的位置
    {
        p = p->nextarcs;
    }
    if(p->nextarcs!=NULL)    // 下个节点存在
        return p->nextarcs->adjvex;
    else    // 下个节点不存在
        return -1;
}
//--------------------------------------------------

void DFS(ALGraph &G, int v)
{// 从第v个顶点开始递归比深度优先遍历图 连通图 G
    cout<=0; w=NextAdjVex(G,v,w))
    // FirstAdjVex(G,v)表示第v个节点的第一个邻接点,NextAdjVex(G,v,w)表示v相对与w的下一个节点
    // w>=0表示存在邻接点
        if(!visited[w])
            DFS(G,w);
}

void DFS_No_Connet(ALGraph &G)
{// 对 !-->非连通图<--! G做深度优先遍历
    for(int v=0; vadjvex;  // 表示w是v的邻接点
        if(!visited[w]) // w未被访问
            DFS_AL(G,w);    // 递归访问
        p = p->nextarcs;
    } //
}

void BFS_No_Recursive1(ALGraph &G, int v)
{// 从第v个顶点开始 广度优先 非递归 遍历连通图G
    int i;
    for(i=0; i Q;
    Q.push(v);
    while(!Q.empty())
    {
        int u = Q.front();Q.pop();
        for(int w=FirstAdjVex(G,u); w>=0; w=NextAdjVex(G,u,w))
        {// 依次检查u的所有邻接点;FirstAdjVex(G,u)表示u的第一个邻接点
            //NextAdjVex(G,u,w) 表示u相对于w的下一个邻接点,W>=0表示存在邻接点
            if(!visited[w])
            {
                cout< Q;
    for(i=0; i=0; w=NextAdjVex(G,u,w))
                    if(!visited[w])
                {
                    cout<
            }// 
        }// 
    }// 
}

void DFS_No_Recursive(ALGraph &G)
{//邻接表存储图的非递归深度优先遍历
	ArcNode *p;
	stack S;
	cout <adjvex] != 1)
            {
				cout <adjvex].data<<" ";
				visited[p->adjvex] = 1;
				S.push(p->adjvex);
				break;
			}
            else
			{
				p = p->nextarcs;
			}
		}
		if (p == NULL)
		{
			S.pop();
		}
	}
}

int main()
{
    ALGraph G;
    for(int i=0; i<=MAX_VERTEX_NUM; i++)    // 每次遍历之前记得初始化访问记录数组!!!!
        visited[i] = 0;
    int D[MAX_VERTEX_NUM],ID[MAX_VERTEX_NUM],OD[MAX_VERTEX_NUM];
    // 创建
    CreatGraph_DN(G);
    // 统计度
    CountVerNum_DN(G,D,ID,OD);
    for(int i=0;i<6;i++)
        printf("D:%d ID:%d OD:%d\n",D[i],ID[i],OD[i]);
    // 输出邻接表
    Display_AdjacencyList_DN(G);
    // 遍历邻接表



    return 0;
}

/*
第一组测试数据 data为char
测试数据:
连通图
6 6
A B C D E F
A B
A C
B D
C D
D E
C F

非连通图
6 5
A B C D E F
A B
A C
B D
C D
D E

第二组测试数据 data为char [3]
请修改CreatGraph函数 和 typedef struct VNode
输入:
12 16
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
c1 c4
c1 c2
c1 c3
c1 c12
c4 c5
c2 c3
c3 c5
c3 c7
c5 c7
c3 c8
c9 c12
c9 c10
c10 c12
c9 c11
c11 c6
c6 c8
*/

 

你可能感兴趣的:(数据结构——图整理代码(邻接表存储图))