Я создаю двусвязный список, который будет составлять алфавитный список имен, но я не уверен, что поместить в функцию int main () - PullRequest
0 голосов
/ 10 ноября 2011

В конечном итоге, программа распечатает список имен в алфавитном порядке вместе с дополнительными атрибутами, связанными с этим именем. Другими словами, экран вывода будет выглядеть следующим образом:

Ares: Greek, fire, sword.
Freia: Norse, water, bow and arrow.
Poseidon: Greek, horses, ocean.
Thor: Norse, chariot, hammer.
Zeus: Greek, cloud, lightning.

Опять же, имена в этом списке расположены в алфавитном порядке, но атрибуты печатаются рядом с ними. Что касается моего int main (), я не уверен, как мне начать сортировать эти имена и приводить их в порядок. У меня есть несортированный список, который нужно отсортировать (используя функции, которые добавляют / вставляют эти имена в правильном порядке).

    //
    // This is a standard library support code to the chapters of the book
    // "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
    //

    #ifndef STD_LIB_FACILITIES_GUARD
    #define STD_LIB_FACILITIES_GUARD 1

    #include <cmath>
    #include <iostream>
    #include <vector>
    #include <stdexcept>
    #include <string>

    using namespace std;

    //------------------------------------------------------------------------------

    // Helper function to show an error message
    inline void error(const string& errormessage)
    {
    throw runtime_error(errormessage);
    }

    //------------------------------------------------------------------------------

    #endif // STD_LIB_FACILITIES_GUARD

    //------------------------------------------------------------------------------

    struct Link {
    string name;
    string mythology;
     string vehicle;
    string weapon;

    Link* prev;
    Link* succ;
    Link(const string& n, const string& a, const string& b, const string&c,Link* p = 0,    
    Link* s = 0)
: name(n), mythology(a), vehicle(b), weapon(c), prev(p), succ(s) { }
    };



    Link* insert(Link* p, Link* n)    // insert n before p; return n
    {
    if (n==0) return p;
    if (p==0) return n;
     n->succ = p;        // p comes after n
    if (p->prev) p->prev->succ = n;
     n->prev = p->prev;    // p's predecessor becomes n's predecessor
     p->prev = n;        // n becomes p's predecessor
     return n;
     }

    void print_all(Link *p)
    {
Link *current;
current = p;
while(current)
{
    cout<<"For this link we have: \n";
    cout<<"Name: "<<current->name<<".\n";
    cout<<"Info1: "<<current->mythology<<".\n";
    cout<<"Info2: "<<current->vehicle<<".\n";
    cout<<"Info3: "<<current->weapon<<".\n";
    current = current->succ;
}

    }
    Link * add_after_find(Link *p, Link *n,const string& s )
     {   Link *current = 0;
current = p;
/* empty list */
if(p == 0)
{   cout<<"List is empty so string not found so not added after it. \n";

    return  0;
}
/*  DO WE NEED ONE LINK ONLY */
else if(p->succ == 0)   /* one link only */
{
    if(p->name == s)
    {

        /* add after link with s */
        /* p in front */
        p->succ = n;
        n->prev = p;
        p->prev = 0;
        n->succ = 0;

        return p;      
    }   /* end of if names =  */
    else {
        cout<<"String not found in link listed so not added. \n";
        return p;

    }

}  /* end of one link */

else /* two or more links */

{   
    current = p;
    while(current->succ)
    {
        if (s == current->name)


        {

            /* then n goes AFTER this link */
            n->prev = current;
            n->succ = current->succ;
            current->succ = n;


            return p;
        }  /* end of name matches */

        else 
        {
            current = current->succ;
        }
    }// end of while
    /* if outside of while then we are at last link with a current -> name 
     so s not found  */
    cout<<"String is not found so not add after it. \n";
    return p;
}  // end of else 2 or more
}  // end of function

int main()
{      
    Link*newlist = new Link("Thor","Norse","chariot","hammer");
    newlist = add_after_find(newlist,new Link("Hera","Greek", "horse", "arrow"),"Thor");
    newlist = add_after_find(newlist,new Link("Poseidon","Greek", "ocean", "trident"),"Freia");
     newlist = add_after_find(newlist,new Link("Ares","Greek", "fire", "sword"),"Poseidon");
     newlist = add_after_find(newlist,new Link("Zeus","Greek", "cloud", "lightning"),"Ares");

    print_all(newlist);
    cout<<"Now let's alphabetize these five gods.\n";
    system("Pause");
    return 0;
}

1 Ответ

1 голос
/ 10 ноября 2011

Я предполагаю, что это домашнее задание, если нет, простой ответ заключается в том, что вы должны использовать std::list и метод sort в этом контейнере.

Что положить в main?Скорее всего, что-то в строках: sort_list( newlist ), где указатель передается по ссылке (поскольку заголовок списка, вероятно, изменится).Что касается того, как это реализовать, это зависит от того, какой алгоритм сортировки вы хотите реализовать, возможно, самым простым будет пузырьковая сортировка, следующим лучшим выбором для списка будет сортировка слиянием.Google для них, и если вам нужна помощь с алгоритмами, вернитесь и спросите.

В то же время, вы можете поработать над вопросами, которые я поднял в качестве комментариев к вопросу: форматирование кода, утечки памяти (как при вставке, если позиция не найдена, так и в конце программы), правильность структуры данных всегда ... Я не провел углубленный анализ, но у меня есть ощущение, что ваша add_after_find можетошибка, когда нужно добавить элемент в конец списка ... Прежде чем вы начнете даже рассматривать сортировку, вы должны убедиться, что ввод будет правильным.Отладить текущие проблемы проще, чем если бы вы начали добавлять больше кода.

...