第一次发表文章,如果有不正确的请指正。
代码如下:
#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码递增)