数据结构创建邻接表图--从txt文件读取顶点信息

第一次发表文章,如果有不正确的请指正。

代码如下:

#include "graph.h"

int main()
{
    Graph().show_graph();
}


//创建邻接表的头文件
#ifndef UNTITLED_GRAPH_H
#define UNTITLED_GRAPH_H

#include <iostream>
#include "vector"

#include "readtxt.h"
#define MAXSIZE 10
using namespace std;

typedef struct graph_list{     //存放连接的顶点的数据
    char data;
    graph_list* pnext;
    int weight;
}NODE,*PNODE;

typedef struct graph{           //存放顶点的数据
    char data;
    PNODE pnode;
}graph,graphsize[10];

class Graph{
private:
    struct graph *my_graph;
    int size;                     //图的顶点的个数
    PNODE p;                   //遍历移动的指针
public:
    Graph();                     //构造方法
    void show_graph();          //打印整个图的信息
};

Graph::Graph()
{
    size = MyReadtxt().size();
    graph *haha1 = new struct graph[size];         //申请结构体空间
    my_graph = haha1;                               //类成员属性my_graph指向刚刚申请的haha1
    for(int i =0;i<size;i++)
    {
        my_graph[i].pnode = new NODE;            //为结构体的结构体申请空间
    }
    vector<string>s;
    string road;
    int road_size;
    for(int i=0;i<size;i++)
    {
        p = my_graph[i].pnode;                  //移动的工作指针
        my_graph[i].data = char('A'+i);
        cout<<"现在在处理顶点:"<<my_graph[i].data<<endl;
        road = MyReadtxt("C:\\Users\\ycig\\Desktop\\data.txt").getmyline(i+1);    //获取第一行数据;
        s = MyReadtxt().split_string(road," ");    //切割字符串
        road_size = s.size();
        for(int i = 0;i<road_size;i++) {
            PNODE pnew = new NODE;
            pnew->pnext = NULL;
            pnew->data = s[i][0];
            pnew->weight = atoi(s[i].substr(1).c_str());                //保存的是字符串,要进行类型转换
            p->pnext = pnew;
            p = p->pnext;
        }
    }
}

void Graph::show_graph() {
    for(int i=0;i<size;i++)
    {
        cout<<my_graph[i].data<<"连接的顶点情况如下:"<<endl;
        p = my_graph[i].pnode->pnext;
        while (p)
        {
            cout<<"连接的顶点:"<<p->data<<"的权重是:"<<p->weight<<endl;
            p = p->pnext;
        }
    }
}

#endif //UNTITLED_GRAPH_H





//从txt读取数据的头文件
#ifndef UNTITLED_READTXT_H
#define UNTITLED_READTXT_H

#include "string"
#include "vector"
#include "fstream"
using namespace std;

class MyReadtxt{
private:
    string filepath = "C:\\Users\\ycig\\CLionProjects\\untitled\\data.txt";    //文件的默认路径
    vector<string>words;                                                      //读取的文件存放的数组
    int lines;                                                         //文件一共有多少行
public:
    MyReadtxt();
    MyReadtxt(string path);    //重载构造函数
    void show();            //打印读取到的文件
    string getmyline(int line);       //获取某行字符串
    vector<string> split_string(string str,string pattern);   //切割字符串,以pattern进行切割
    int size();
};
void MyReadtxt::show() {
    vector<string>::iterator iter;
    for(iter = words.begin();iter!=words.end();iter++)
    {
        cout<<*iter<<endl;
    }
}
MyReadtxt::MyReadtxt()                   //构造函数读取文件,默认路径是类成员属性的file_path的值
{
   // cout<<"文件的路径是:"<<filepath<<endl;
    ifstream in(filepath);
    string line;
    while (getline(in,line))
    {
        words.push_back(line);
    }
    lines = words.size();
}
MyReadtxt::MyReadtxt(string path){        //构造函数的重载,传入的参数是要读取文件的路径
    filepath = path;
    //cout<<"文件的路径是:"<<filepath<<endl;
    ifstream in(filepath);
    string line;
    while (getline(in,line))
    {
        words.push_back(line);
    }
    lines = words.size();
}

string MyReadtxt::getmyline(int line) {        //获取txt文件的某一行数据
    return words[line-1];
}
vector<string> MyReadtxt::split_string(string str,string pattern)  //对字符串进行切割,返回字符串数组,pattern是要匹配字符串
{
    vector<string>result;            //保存切割后的字符串
    string strs = str + pattern;         //拼接字符串,必然匹配到一个pattern,这样如果原字符串没有pattern就会返回原来字符串
    size_t pos = strs.find(pattern);   //找到第一个
    size_t size = strs.size();    //获取字符串的长度
    while(pos!=strs.npos)
    {
        string sub = strs.substr(0,pos);
        result.push_back(sub);
        strs = strs.substr(pos+1,size);
        pos = strs.find(pattern);
    }
    return result;
}
int MyReadtxt::size() {
    return lines;
}

#endif //UNTITLED_READTXT_H

最后程序运行的结果如下:

读取的文件截图:

数据格式:每一行是边的连接信息,被连接的顶点名(字符),权重,空格,下一个连接信息;

每一行表示一个顶点的连接信息。

默认顶点依次从ABCD开始的(ASCII码递增) 

 

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值