Динамический список

Тема в разделе "C/C++/C#", создана пользователем XADD, 11 сен 2011.

  1. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    Код (C++):
    #include <iostream>
    using namespace std;

    class List
    {
    class Node
    {
    public:
    int d;
    int Year;
    char Author;
    char Name;
    Node *next;
    Node *prev;
    Node (int dat=0, int year=0, char Author=0, char Name=0)
    {
    d=dat;
    Year=year;
    next=0;
    prev=0;
    }
    };
    Node *pbeg,*pend;
    public:
    List() {pbeg=0; pend=0;}
    ~List()
    {
    if (pbeg!=0)
    {
    Node *pv=pbeg;
    while (pv)
    {
    pv=pv->next;
    delete pbeg;
    pbeg=pv;
    }
    }
    }
    void Add (int d, int year, char Author, char Name)
    {
    Node *pv = new Node(d,year,Author,Name);
    if (pbeg==0) pbeg=pend=pv;
    else
    {
    pv->prev=pend;
    pend->next=pv;
    pend=pv;
    }
    }

    void Print ()
    {
    Node *pv=pbeg;
    cout << endl << "List: ";
    while (pv)
    {
    cout << pv->d << ' ';
    cout << pv->Year << ' ';
    cout << pv->Author << '';
    cout << pv->Name << '';
    pv=pv->next;
    }
    cout << endl;

    }

    };
    int main()
    {
    List l;
    char a,b;

    cin >> a;
    cin >> b;
    l.Add(1,1990,a,b);
    l.Print();
    return 0;
    }
    Задача состоит в том что бы получить динамический список с четырьмя параметрами, программа очень простая и вроде понятно что она должна делать.ПеременнаяAuthor содержит имя автора, Name название книги. Но оно не работает. Спасибо.
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Переменные типа char могут содержать в себе только один байт информации, а ты пытаешься запихать туда целую строку. Пожалуйста.
     
  3. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    Вообщем появилась новая проблема.
    Код (C++):
    #include <iostream>
    using namespace std;
    struct comp
    {
    char Name[20];
    char Author[20];
    int year;
    int d;
    comp *next;
    };
    struct DynamicList
    {
    comp* head;
    comp* tail;
    };
    class Library
    {
    public:

    void MakeList(DynamicList &l)
    {
    l.head=NULL;
    }
    bool CheckEmpty(DynamicList &l)
    {
    return (l.head==NULL);
    }
    void Add(DynamicList &l,char* v)
    {
    char Nam[20];
    cout << "Input Name: ";
    cin >> Nam;
    comp* c = new comp();
    strcpy_s(c->Name, 20, Nam);
    strcpy_s(c->Author, 10, v);
    c->next = NULL;
    if (CheckEmpty(l))
    l.head = c;
    else
    l.tail->next = c;
    l.tail = c;
    }
    void Show (DynamicList &l)
    {
    while (l.head!=NULL)
    {
    cout << l.head->Name << " " << l.head->Author << endl;
    l.head=l.head->next;
    }
    }
    };
    int main()
    {
    Library lol;
    DynamicList vars;
    lol.MakeList(vars);
    char a[20]={0};
    int vybor=0;
    while (vybor!=5)
    {
    cin >> vybor;
    if (vybor==1) lol.Add(vars,"First");
    if (vybor==2) lol.Show(vars);
    }

    return 0;
    }
    Смысл программы подразумевает. Выбираем 1, добавляем запись, выбираем 2 просматриваем её, снова выбираем 1 добавляем новую запись и в просмотре уже должны быть две записи но она всего одна. что исправить? Получается список какой-то не верный.
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
     char a[20]={0};
    не используется
     
  5. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Изменять значение l.head нельзя. Оно всегда должно указывать на начало списка.
    Код (C++):
        void Show (DynamicList &l)
    {
    while (l.head!=NULL)
    {
    cout << l.head->Name << " " << l.head->Author << endl;
    l.head=l.head->next;
    }
    }
    замени на:
    Код (C++):
        void Show (DynamicList &l)
    {
    comp *p = l.head;
    while ( p )
    {
    cout << p->Name << " " << p->Author << endl;
    p = p->next;
    }
    }
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
    #include <iostream>

    struct comp {
    char    Name[20],
    Author[20];
    comp    *next;
    };
    struct DynamicList {
    comp    *head,
    *tail;
    };

    class Library {
    DynamicList l;

    public:

    Library( ) {
    l .head = 0;
    }

    void Add( char *v ) {
    char Nam[20];
    std ::cout << "Input Name: ";
    std ::cin >> Nam;

    comp *c = new comp( );

    strcpy_s( c ->Name, 20, Nam );
    strcpy_s( c ->Author, 10, v );
    c ->next = NULL;

    if( 0 == l.head )
    l .head = l .tail = c;
    else
    l .tail = l .tail ->next = c;

    }

    void Show ( ) {
    comp *p = l .head;

    while ( p ) {
    std ::cout << p ->Name << " " << p ->Author << std ::endl;
    p = p ->next;
    }
    }
    };
    int main( ) {
    Library         lol;
    int             vybor;

    vybor = 0;
    for(;; ) {
    std ::cin >> vybor;

    switch( vybor ) {
    case 0:
    return 0;
    case 1:
    lol .Add( "First" );
    break;
    case 2:
    lol .Show( );
    break;
    default:
    std ::cout << "";
    }
    }
    }
    Впринципе работает, но явно не хватает деструктора, нужно дать нормальные имена переменным и мне не нравится структура DynamicList

    Добавлено: и еще, реализацию методов лучше вынести в .cpp файл, а описание класса - в .h.
    ЗЫ. Форматирование кода на форуме радует :)

    Добавлено:
    Там еще ошибка при добавлении узла была.
     
  7. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    :) Спасибо. Еще бы функцию сортировки списка по полям и было бы вообще хорошо.
     
  8. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Да легко, при соблюдении пятого пункта правил раздела:
     
  9. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    Ну нет я самостоятельно хочу делать но не очень получается, вот например для двух элементов, не
    как сделать для произвольного количества.
    Код (C++):
    void Sort()
    {
    bool j=true;
    comp *p=l.head;
    char temp[20];
    {
    for (int i=0;i<2;i++)
    {
    for (int j=1;j>1;j--)
    {
    if ((char)(p->Author)>char((p->next)->Author))
    {
    strcpy(temp,p->Author);
    strcpy(p->Author,((p->next)->Author));
    strcpy(((p->next)->Author),temp);
    }
    }
    }
    }
    }
     
  10. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    XADD
    Сортировка списка по логике ничем не отличается от сортировки массива. Отличие лишь в том что вместо увеличения значение счетчика элементов массива необходимо писать нечто вроде:
    Код (Text):
     p = p ->next;
    Так строки сравнивать нельзя:
    Код (Text):
    (char)(p->Author)>char((p->next)->Author)
    вы сравниваете первые элементы строк. Используйте strcmp

    Добавлено:
    не нашел где вы индексы "i" и "j" используете

    Добавлено:
    лишняя фигурная скобка, это не ошибка, но фигурная скобками ограничивается область видимости переменных. У вас она абсолютно не нужна, лишь вносит путаницу.
     
  11. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    Вообщем появилось время я вновь вернулся к задача.
    Код (C++):
    void Sort()
    {
    bool j=true;
    comp *p=l.head;
    char temp1[20];
    char temp2[20];

    while (p->next)
    {
    if (strcmp(p->Author,(p->next)->Author)>0)
    {
    strcpy(temp1,p->Author);
    strcpy(p->Author,(p->next)->Author);
    strcpy((p->next)->Author,temp1);

    strcpy(temp2,p->Name);
    strcpy(p->Name,(p->next)->Name);
    strcpy((p->next)->Name,temp2);
    }
    p=p->next;
    }
    }
    Почему-то не сортирует весь список полностью с первого раза.
    Не хватает внутреннего цикла, но как его написать?
     
  12. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    XADD
    Еще раз, посмотрите реализацию любого алгоритма сортировки и сравните с тем что получилось у вас
     
  13. XADD

    XADD New Member

    Регистрация:
    11 сен 2011
    Сообщения:
    2
    Симпатии:
    0
    А неужели сложно подсказать?
     
Загрузка...
Похожие Темы - Динамический список
  1. SeverBap
    Ответов:
    13
    Просмотров:
    11.956
  2. xbeetle
    Ответов:
    15
    Просмотров:
    927
  3. WingmanIX
    Ответов:
    2
    Просмотров:
    1.451
  4. Marazm
    Ответов:
    0
    Просмотров:
    1.292
  5. Mitya
    Ответов:
    6
    Просмотров:
    2.056

Поделиться этой страницей