Member 14028865 Ответов: 1

Помощь с хранением данных в связанном списке - - узел с 3 типами данных


Всем привет. Я был довольно озадачен этой проблемой в течение некоторого времени и исчерпал youtube и google. У меня возникли проблемы с вставкой данных в узел многосвязного списка данных. Я не уверен, дую ли я на указатель или что, но я сильно запутался.


<если я позвоню

inFile1 >> S >> N;
insertnode(head,S,N);

отдельно без цикла он сохраняет данные в связанных списках и распечатывает их (с дополнительным непреднамеренным значением ==> 6.83919 e+025, которое, как я думаю, является адресом ячейки памяти)>

Любая помощь будет очень признательна.

Что я уже пробовал:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cstring>

using namespace std;

struct node
{
    string element;
    double weight;
    node *next;
};

void insertnode(node *cp,string,double);
void printlist(node *cp);

node *head;

ifstream inFile1, inFile2;
ofstream outFile;

int main()
{
    inFile1.open("Element.txt", ios::in);
    inFile2.open("Formula.txt", ios::in);

    string S;
    double N;
    int i;
    head = new node;
    head->element;
    node *c;

    c = head;

    //while(inFile1 >> S)
    //{
        inFile1 >> S >> N;
        insertnode(head,S,N);
        inFile1 >> S >> N;
        insertnode(head,S,N);
        inFile1 >> S >> N;
        insertnode(head,S,N);
    //}


    printlist(head);


    inFile1.close();
    inFile2.close();

    return 0;
}
node *
newnode()
{
    node *t;

    t = new node;
    t->element = "";
    t->weight = 0;
    t->next = NULL;
    return t;
}
void insertnode(node *cp, string S, double N)
{
    node *p, *t;
    p = NULL;

    if(head == NULL)
    {
        head = newnode();
        head->element = S;
        head->weight = N;
    }
    else
    {
        cp = head;
        while(cp != NULL && cp->element.compare(S) > 0)
        {
            p = cp;
            cp = cp->next;
        }
        if(p != NULL)
        {
            t = newnode();
            t->element = S;
            t->weight = N;
            p->next = t;
            t->next = cp;
        }
        else
        {
            t = newnode();
            t->element = S;
            t->weight = N;
            t->next = cp;
            head = t;
        }
    }
}
void printlist(node *cp)
{
    while(cp)
    {
        cout << cp->element << setw(8) << cp->weight << endl;
        cp = cp->next;
    }
}

CPallini

Это что, упражнение? Вы знаете, что стандартная библиотека C++ предоставляет связанные списки.
Каково содержание входного файла?

1 Ответов

Рейтинг:
12

Rick York

Мне кажется, что проблема заключается в инициализации списка. Начните с установки Node в nullptr при его объявлении. Затем назначьте значения членам структуры в одном и только одном месте. Это упростит остальную часть вашей логики. Вот небольшой пример этого -

struct node
{
    string element;
    double weight;
    node * next;

    node()   // constructor
    {
        Set( "", 0, nullptr );
    }

    void Set( string e, double w, node* pnext=nullptr )
    {
        element = e;
        weight = w;
        next = pnext;
    }

    static node * Create()   // this replaces the newnode function
    {                        // usage is node *pn = node::Create();
        return new node;
    }
};

typedef node * pnode;

pnode Head = nullptr;  // I capitalize first letter of global variables
Теперь функция вставки может быть значительно упрощена. Но есть и другая проблема. То есть вы передаете head в качестве аргумента функции insert, а также обращаетесь к ней как к глобальной переменной. Это почти всегда плохо кончается. Обычно передается указатель на начало списка, но это не обязательно. Вот способ справиться с этим только как с глобальной переменной.
void insertnode( string s, double n )
{
    if( ! Head )
    {
        Head = node::Create();
        Head->Set( s, n );
        return;
    }

    node * prv = NULL;
    node * cur = Head;
    while( cur && ( cur->element.compare(s) > 0 ) )
    {
        prv = cur;
        cur = cur->next;
    }

    node * pnew = node::Create();
    pnew->Set( s, n, cur );

    if( prv )
        prv->next = pnew;
    else
        Head = pnew;   // this is the new head element
}
С помощью этого кода вы не передадите функции начало списка. Вы легко могли бы это сделать, но вам нужно передать адрес указателя. Я не думал, что ты к этому готова.

Это будет прототип, если будет передан указатель на начало списка:
void insertnode( pnode * pHead, string e, double w );


KarstenK

Почему вы используете структуру? Вам лучше использовать clase и it-нотацию.

Rick York

Вопрос использует структуру, и для этой цели он работает одинаково. Обычно я бы так и сделал, и обычно использую структуры только для POD.