欢迎光临散文网 会员登陆 & 注册

C++ 带有入度和路径权值的领接表的建立

2023-06-24 20:33 作者:bili_69278239799  | 我要投稿

//输入参数 

//a b c d e q 空格

//ab5 ae4 ac3 bc2 cd8 ce6 de10 q 空格

#include <cstddef>

#include <iostream>

#include <sstream>

#include <string>

#include <array>

#include <memory>

#include <map>


using namespace std;

union VexItem

{

    char value_;

    int index_;

};


class Vex

{

public:

    Vex(Vex&&) = default;

    Vex& operator =(Vex&&) = default;

    Vex() = default;

    explicit Vex(char ch, int cost = 0)

    : cost_(cost)

    , rudu_(0)

    , next_(nullptr)

    {

        vex_item_.value_ = ch;

        //cout << "init vex_item_.value_: " << vex_item_.value_ << endl;

    }


    explicit Vex(int index, int cost = 0)

    : cost_(cost)

    , rudu_(0)

    , next_(nullptr)

    {

        vex_item_.index_ = index;

        //cout << "init vex_item_.index_: " << vex_item_.index_ << endl;

    }


    VexItem vex_item_;

    int cost_;

    int rudu_;

    shared_ptr<Vex> next_;

};


int main() {

    constexpr int input_len{2 + 10};

    constexpr auto vex_len{100};

    int vex_count{0};

    array<Vex, vex_len> vex;

    map<char, int> vex_index;

    auto string2num = [](const char* str)

    {

        int cost{0};

        stringstream ss;

        ss << str;

        ss >> cost;

        return cost;

    };


    for(int i = 0 ;; ++i)

    {

        array<char, input_len> input;

        cout << "input vex point" << endl;

        cin.getline(input.data(), input_len, ' ');

        //cout << "you input vex point:" << input.data() << endl;


        if(input[0] == 'q')

            break;

       

        vex[i] = Vex(input[0]);

        vex_index[input[0]] = i;

        vex_count++;

        //cout << input[0] << " map to " << i << endl;

    }


    cin.ignore(std::numeric_limits< streamsize >::max(), '\n');

    do

    {

        array<char, input_len> input;

        cout << "input vex pair and cost" << endl;

       

        cin.getline(input.data(), input_len, ' ');

        //cout << "you input vex pair and cost:" << input.data() << endl;


        if(input[0] == 'q')

            break;

       

        cout << input[0] << "}}" << input[1] << endl;

        auto from_index = vex_index[input[0]];

        auto to_idnex = vex_index[input[1]];

        auto tmp = make_shared<Vex>(to_idnex, string2num(input.data() + 2));

       

        tmp->next_ = vex[from_index].next_;

        vex[from_index].next_ = tmp;

        vex[to_idnex].rudu_++;

       

    }while(true);

    //a b c d e q

    //ab5 ae4 ac3 bc2 cd8 ce6 de10 q

    for(int i = 0; i < vex_count; i++)

    {

        auto& item = vex[i];

        if(item.vex_item_.value_ == '\0' && item.vex_item_.index_ == 0)

            break;

        auto ptr = item.next_;

        cout << "vex :" << item.vex_item_.value_ << ", rudu:" << item.rudu_ << endl;

        if(ptr == nullptr)

        {

            cout << "end vex:" << item.vex_item_.value_ << endl;

        }


        for(; ptr != nullptr; ptr = ptr->next_)

        {

            cout << item.vex_item_.value_ << "-" << ptr->cost_ << "->" << vex[ptr->vex_item_.index_].vex_item_.value_ << "  ";

        }

        cout << endl;

    }


    return 1;

}



C++ 带有入度和路径权值的领接表的建立的评论 (共 条)

分享到微博请遵守国家法律