Я создаю двусвязный список, который расположит список имен в алфавитном порядке, но я не уверен, что поместить в функцию int main ()

#c #function #linked-list #doubly-linked-list

#c #функция #linked-list #двусвязный список

Вопрос:

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

 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 stringamp; 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 stringamp; n, const stringamp; a, const stringamp; b, const stringamp;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 stringamp; 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. Если это домашнее задание, пожалуйста, пометьте его как таковое.

2. tl; dr у вас возникла реальная проблема или вы ищете кого-то, кто решит это за вас?

3. Ооо. Забыл указать. В основном я ищу кого-нибудь, кто поможет мне разобраться в этом с помощью некоторого псевдокода.

4. @user994559: Вам следует поработать над форматированием кода, в частности над отступами и форматированием вокруг if конструкций. Форматирование кода — отличная помощь в чтении кода и во избежание мелких ошибок, например, у вас есть однострочные if строки, за которыми следует строка с отступом, которая не является частью if ветви, что затрудняет чтение сразу.

5. Кроме того, у вас есть другие проблемы в вашем коде: в вашей программе происходит утечка памяти (что происходит с Poseidon ?), это проблема дизайна, поскольку ваш интерфейс не позволяет вам обрабатывать этот конкретный случай. Возможно, вы захотите реализовать find и add , а затем предложить add_after_find поверх них обработку условий ошибки немного более изящно. Ваши инварианты списка (указатели prev / succ относятся к предыдущим / следующим элементам в списке) поддерживаются не во всех случаях (в случае списка с более чем одним элементом, что произойдет, когда вы найдете место для вставки, если элементов больше?)

Ответ №1:

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

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

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

Комментарии:

1. Это абсолютно проще отлаживать по ходу, а не в конце. Определение того, что у вас есть правильные данные до сортировки, избавит вас от множества головных болей в долгосрочной перспективе.