用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


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

数据结构与算法----4.4 用邻接表存储图:1、插入一个顶点2、删除一条弧3、

2019-07-21 作者: Ryan2019举报

[c++]代码库

#include<iostream>
using namespace std;
const int MVN = 21;
typedef char VeuType;//顶点元素类型
typedef struct ArcNode
{
    int adjveu;//弧指向的顶点位置
    int adj;//权
    ArcNode *neutarc;//指向下一条弧的顶点
}*ArcPtr;
struct VeuNode
{
    VeuType data;//顶点数据
    ArcPtr firstarc;//指向第一条依附于该顶点的弧
    bool visited;//是否被访问过
};
struct ALGraph
{
    VeuNode veus[MVN];
    int kind, veunum, arcnum;//类型,顶点数,弧数
};
int LocateVeu(ALGraph &G, VeuType v);//在图G中查找顶点
bool InsertArc(ALGraph &G, VeuType u, VeuType v, int w = 1);
void CreateGraph(ALGraph &G, int Kind, char v[]);
void GraphPrint(ALGraph &G);
bool insertdian(ALGraph &G, VeuType u);//插入一个顶点
bool DeleteHu(ALGraph &G, VeuType u, VeuType v);//删除一条弧
bool Deletedian(ALGraph &G, VeuType u);
int main()
{
    char g[] = "sacd#sascsdacadcd#";
    cout << "原始序列为 "<< endl<<g <<endl;
    int Kind = 1;
    ALGraph G;
    CreateGraph(G, Kind, g);
    GraphPrint(G);
    VeuType v = 'c';
    Deletedian(G, v);
    cout << "删除顶点" <<v<< endl;
    GraphPrint(G);
    VeuType u = 'e';
    insertdian(G, u);
    cout << "插入顶点" <<u<< endl;
    GraphPrint(G);
    VeuType v1 = 's';
    VeuType v2 = 'a';
    cout << "删除弧<"<<v1<<","<<v2<<">" << endl;
    DeleteHu(G, v1, v2);
    GraphPrint(G);
    return 0;
}
 
int LocateVeu(ALGraph &G, VeuType v)
{
    int i;
    for (i = G.veunum; i > 0 && G.veus[i].data != v; i--);
    return i;
}
bool InsertArc(ALGraph &G, VeuType u, VeuType v, int w )
{
    ArcPtr p;
    int i, j;
    bool found;
    i = LocateVeu(G, u);
    if (i == 0)
    {
        return false;
    }
    j = LocateVeu(G, v);
    if (j == 0 || j == i)
    {
        return false;
    }
    for (found = false, p = G.veus[i].firstarc; p && !found; p = p->neutarc)//若弧存在,插入失败
    {
        if (p->adjveu == j)
        {
            found = true;
        }
    }
    if (found)
    {
        return false;
    }
    G.arcnum++;
    p = new ArcNode;
    p->adjveu = j;
    p->adj = w;
    p->neutarc = G.veus[i].firstarc;
    G.veus[i].firstarc = p;//表头插入弧,假设对弧的次序无要求
    if (G.kind <= 2)
    {
        return true;
    }
    G.arcnum++;
    p = new ArcNode;
    p->adjveu = i;
    p->adj = w;
    p->neutarc = G.veus[j].firstarc;
    G.veus[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.veus[i].data = v[i - 1];
        G.veus[i].firstarc = NULL;
    }
    G.veunum = 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 << "顶点数:" << G.veunum << "       " << "弧数:" << G.arcnum << endl;;
    cout << "邻接表" << endl;
    for (int i = 1; i <= G.veunum; i++)
    {
        cout << G.veus[i].data;
        for (p = G.veus[i].firstarc; p; p = p->neutarc)
        {
            cout << "->" << p->adjveu;
        }
        cout << endl;
         
    }
}
bool insertdian(ALGraph &G, VeuType u)
{
    int i;
    i = LocateVeu(G, u);
    if (i != 0)
    {
        return false;
    }
    G.veunum++;
    G.veus[G.veunum].data = u;
    G.veus[G.veunum].firstarc = NULL;
    return true;
}
bool DeleteHu(ALGraph &G, VeuType u, VeuType v)
{
    ArcPtr p,q; int i, j; bool found;
    i = LocateVeu(G, u);
    if (i == 0) return false;
    j = LocateVeu(G, v);
    if (j == 0 || j == i)return false;
    found = false;
    p = NULL;
    q = G.veus[i].firstarc;
    while (q && !found)
    {
        if (q->adjveu == j)found = true;
        else {
            p = q;
            q = q->neutarc;
        }
    }
    if (!found)return false;//没有该弧
    if (p) p->neutarc = q->neutarc;
    else G.veus[i].firstarc = q->neutarc;
     
    delete q; G.arcnum--;
    if (G.kind <= 2) return true;
    //无向图的情况
    found = false;          
    p = NULL;
    q = G.veus[j].firstarc;
    while (q && !found)
    {
        if (q->adjveu == i)found = true;
        else {
            p = q;
            q = q->neutarc;
        }
    }
    if (p) p->neutarc = q->neutarc;
    else G.veus[j].firstarc = q->neutarc;
    delete q;
    G.arcnum--;
    return true;
     
}
bool Deletedian(ALGraph &G, VeuType u)
{
    ArcPtr p, q; int i,j; bool found;
    i = LocateVeu(G, u);
    if (i == 0) return false;
     
    //删除出弧,弧数对应减少
    p = G.veus[i].firstarc;
    while (p)
    {
        q = p;
        p = p->neutarc;
        delete q;
        G.arcnum--;
    }
    //删除入弧,弧数对应减少
    for ( j = 1; j <= G.veunum; j++)
    {
        if (j != i)
        {
            found = false;
            p = NULL;
            q = G.veus[j].firstarc;
            while (q && !found)
            {
                if (q->adjveu == i) found = true;
                else
                {
                    p = q;
                    q = q->neutarc;
                }
            }
            if (!found)
                continue;
            if (p)
                p->neutarc = q->neutarc;
            else
                G.veus[j].firstarc = q->neutarc;
            delete q;
            G.arcnum--;
        }
    }
    G.veus[i] = G.veus[G.veunum];
    for ( j = 1; j <= G.veunum; j++)
    {
         
        for (p= G.veus[j].firstarc;p;p=p->neutarc)
        {
            if (p->adjveu == G.veunum)
            {
                p->adjveu = i;
                break;
            }
        }
    }
    G.veunum--;
    return true;
     
}


网友评论    (发表评论)


发表评论:

评论须知:

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


扫码下载

加载中,请稍后...

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

加载中,请稍后...