C++数据结构的一些代码(图部分)

四、图

1.图创建

1.1邻接矩阵

#include <iostream>
using namespace std;

#define MAXLEN 100

class Graph
{
   
   
private:
    int vexnum;
    int matrix[MAXLEN][MAXLEN];
    string vertex[MAXLEN];

    int FindIndex(string v)
    {
   
   
        for (int i = 0; i < vexnum; i++)
            if (v == vertex[i])
                return i;

        return -1;
    }

public:
    Graph(int n)
    {
   
   
        vexnum = n; //传入结点个数

        for (int i = 0; i < vexnum; i++) //邻接矩阵初始化
        {
   
   
            for (int j = 0; j < vexnum; j++)
                matrix[i][j] = 0;
        }

        for (int i = 0; i < vexnum; i++) //传入结点
            cin >> vertex[i];
        int edge;
        cin >> edge; //传入边数
        for (int i = 0; i < edge; i++)
        {
   
   
            string v1, v2;
            cin >> v1 >> v2;
            int start = FindIndex(v1);
            int end = FindIndex(v2);

            matrix[start][end] = 1;
          	
            matrix[end][start] = 1; //无向图的邻接矩阵为对称的
        }
    }
    void Show()
    {
   
   

        for (int i = 0; i < vexnum; i++)
        {
   
   
            cout << vertex[i] << ' ';
        }
        cout << endl;

        for (int i = 0; i < vexnum; i++)
        {
   
   
            for (int j = 0; j < vexnum; j++)
            {
   
   
                cout << matrix[i][j] << ' ';
            }
            cout << endl;
        }
    }
};

int main()
{
   
   
    int t;
    cin >> t;
    while (t--)
    {
   
   
        int n;
        cin >> n;
        Graph m(n);
        m.Show();
    }

    return 0;
}

/*
输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构
样例输入:
2
4 A B C D
2        
A B      
A C      
6 V1 V2 V3 V4 V5 V6
5
V1 V2
V1 V3
V2 V4
V5 V6
V3 V5

样例输出:
A B C D  
0 1 1 0
1 0 0 0
1 0 0 0
0 0 0 0
V1 V2 V3 V4 V5 V6
0 1 1 0 0 0
1 0 0 1 0 0
1 0 0 0 1 0
0 1 0 0 0 0
0 0 1 0 0 1
0 0 0 0 1 0
*/

1.2邻接表

第一种写法是突发奇想,第二种算是比较正统的写法

#include <iostream>
using namespace std;

#define MAXLEN 100

class VexNode
{
   
   
public:
    int index;
    VexNode *next;

    VexNode(int i) : index(i) {
   
    next = NULL; }
};
class Graph
{
   
   
private:
    int vexnum, edgenum;
    VexNode *VN[MAXLEN];
    string vexstr[MAXLEN];
    int pos;

    int FindIndex(string v)
    {
   
   
        for (int i = 0; i < vexnum; i++)
        {
   
   
            if (vexstr[i] == v)
                return i;
        }
        return -1;
    }
    void CreateVexChain(VexNode *head, int vni)
    {
   
   
        VexNode *p = head;
        while (p->next != NULL)
        {
   
   
            p = p->next;
        }
        VexNode *t = new VexNode(vni);
        p->next = t;
    }
    void PrintChain(VexNode *head)
    {
   
   
        VexNode *p = head->next;
        while (p)
        {
   
   
            cout << '-' << p->index;
            p = p->next;
        }
        cout << "-^" << endl;
    }

public:
    Graph(int n, int k) : vexnum(n), edgenum(k)
    {
   
   
        for (int i = 0; i < vexnum; i++)
            VN[i] = new VexNode(i);

        for (int i = 0; i < vexnum; i++)
            cin >> vexstr[i];

        for (int i = 0; i < edgenum; i++)
        {
   
   
            string v1, v2;
            cin >> v1 >> v2;

            int start = FindIndex(v1);
            int end = FindIndex(v2);

            CreateVexChain(VN[start], end);
        }
    }
    void Show()
    {
   
   
        for (int i = 0; i < vexnum; i++)
        {
   
   
            cout << i << ' ' << vexstr[i];
            PrintChain(VN[i]);
        }
    }
};

int main()
{
   
   
    int t;
    cin >> t;
    while (t--)
    {
   
   
        int n, k;
        cin >> n >> k;

        Graph g(n, k);
        g.Show();
    }
    return 0;
}
/*
样例输入
1
5 7
A B C D E
A B
A D
A E
B D
C B
C E
E D

样例输出
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^
*/
#include <iostream>
using namespace std;

#define MAXLEN 100

class ArcNode //边表结点
{
   
   
public:
    int adjvex;    //该弧所指向的顶点的下标
    ArcNode *next; //指向下一个边表结点的指针

    ArcNode() {
   
    next = NULL; }
    ArcNode(int i) : adjvex(i) {
   
    next = NULL; }
};
class VNode //顶点表结点
{
   
   
public:
    string data;    //顶点信息
    ArcNode *first; //指向第一条依附该顶点的弧

    VNode() {
   
    first = NULL; }
};
class ALGraph //创建图
{
   
   
private:
    VNode vertices[MAXLEN]; //邻接表
    //创建一个存放指向对应顶点邻接表的最后一个结点的指针
    //通过该指针数组可以避免每次加入新的弧还需要遍历整条邻接表
    ArcNode *pRow[MAXLEN];
    int vexnum, arcnum;     //顶点个数与弧数

    int FindIndex(string v)
    {
   
   
        for (int i = 0; i < vexnum; i++)
        {
   
   
            if (vertices[i].data == v)
                return i;
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值