用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

数据结构与算法----4.3 用邻接表储存图1、求一个顶点的入度2、求一个顶点的

2019-07-21 作者: Ryan2019举报

[c++]代码库

#include<iostream>
using namespace std;
const int MVN = 21;
typedef char VexType;//顶点元素类型
typedef struct ArcNode
{
    int adjvex;//弧指向的顶点位置
    int adj;//权
    ArcNode *nextarc;//指向下一条弧的顶点
}*ArcPtr;
struct VexNode
{
    VexType data;//顶点数据
    ArcPtr firstarc;//指向第一条依附于该顶点的弧
    bool visited;//是否被访问过
};
struct ALGraph
{
    VexNode vexs[MVN];
    int kind, vexnum, arcnum;//类型,顶点数,弧数
};
int LocateVex(ALGraph &G, VexType v);//查找顶点
bool InsertArc(ALGraph &G, VexType u, VexType v, int w = 1);//插入弧
void CreateGraph(ALGraph &G, int Kind, char v[]);
void GraphPrint(ALGraph &G);
int Outdegree(ALGraph &G, VexType u);//求一个顶点的出度
int Indegree(ALGraph &G, VexType u);//求一个顶点的入度
int* degree(ALGraph &G);//求全部顶点的入度
 
int main()
{
    char g[] = "sbcd#sbscsdbcbdcd#";
    cout << "序列为 "<< endl<<g<< endl;
    int Kind = 1;
    ALGraph G;
    CreateGraph(G, Kind, g);
    GraphPrint(G);
    VexType u = 's';
    int n = Outdegree(G, u);
    cout << "顶点"<<u<<"的出度为" << n << endl;
    VexType v = 'c';
    int m = Indegree(G, v);
    cout << "顶点"<<v<<"的入度为" << m << endl;
    int *a = degree(G);
    cout << "各个顶点的入度依次为:";
    for (int j = 1; j <= G.vexnum; j++)
    {
        cout << a[j] << "  ";
    }
    cout << endl;
 
    return 0;
}
int LocateVex(ALGraph &G, VexType v)
{
    int i;
    for (i = G.vexnum; i>0 && G.vexs[i].data != v; i--);
    return i;
}
bool InsertArc(ALGraph &G, VexType u, VexType v, int w )
{
    ArcPtr p;
    int i, j;
    bool found;
    i = LocateVex(G, u);
    if (i == 0)
    {
        return false;
    }
    j = LocateVex(G, v);
    if (j == 0 || j == i)
    {
        return false;
    }
    for (found = false, p = G.vexs[i].firstarc; p && !found; p = p->nextarc)
    {
        if (p->adjvex == j)
        {
            found = true;
        }
    }
    if (found)
    {
        return false;
    }
    G.arcnum++;
    p = new ArcNode;
    p->adjvex = j;
    p->adj = w;
    p->nextarc = G.vexs[i].firstarc;
    G.vexs[i].firstarc = p;
    if (G.kind <= 2)
    {
        return true;
    }
    G.arcnum++;
    p = new ArcNode;
    p->adjvex = i;
    p->adj = w;
    p->nextarc = G.vexs[j].firstarc;
    G.vexs[j].firstarc = p;
    return true;
}
void CreateGraph(ALGraph &G, int Kind, char v[])
{
    int i, w;
    G.kind = Kind;
    G.arcnum = 0;
    i = 0;
    while (true)
    {
        if (v[i] == '#')
        {
            break;
        }
        i++;
        G.vexs[i].data = v[i - 1];
        G.vexs[i].firstarc = NULL;
    }
    G.vexnum = i;
    i++;
    while (true)
    {
        if (v[i] == '#')
        {
            break;
        }
        if (G.kind == 1 || G.kind == 3)
        {
            w = 1;
        }
        else
        {
            w = v[i + 2] - 48;
        }
        InsertArc(G, v[i], v[i + 1], w);
        i = i + 2;
        if (w == 2 || w == 4)
        {
            i++;
        }
    }
 
}
void GraphPrint(ALGraph &G)
{
    ArcPtr p;
    cout << "邻接表" << endl;
    for (int i = 1; i <= G.vexnum; i++)
    {
        cout << G.vexs[i].data;
        for (p = G.vexs[i].firstarc; p; p = p->nextarc)
        {
            cout << "->" << p->adjvex;
        }
        cout << endl;
    }
}
int Outdegree(ALGraph &G, VexType u)
{
    int i = LocateVex(G, u);
    int n = 0;
    ArcPtr p;
    for (p = G.vexs[i].firstarc; p; p = p->nextarc)
    {
        n++;
    }
    return n;
}
int Indegree(ALGraph &G, VexType u)
{
    int i = LocateVex(G, u);
    int n = 0;
    ArcPtr p;
    for (int j = 1; j <= G.vexnum; j++)
    {
        if (j == i)
        {
            continue;
        }
        for (p = G.vexs[j].firstarc; p; p = p->nextarc)
        {
            if (p->adjvex == i)
            {
                n++;
                break;
            }
 
        }
    }
    return n;
}
int* degree(ALGraph &G)
{
    int *a;
    a = new int[G.vexnum + 1];
    for (int i = 1; i <= G.vexnum; i++)
    {
        a[i] = 0;
    }
    ArcPtr p;
    for (int j = 1; j <= G.vexnum; j++)
    {
        for (p = G.vexs[j].firstarc; p; p = p->nextarc)
        {
            a[p->adjvex]++;
        }
    }
    return a;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...