Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++, Списки. Дополнить программу, или подсказать.

14K
08 марта 2007 года
demonoide
30 / / 11.02.2007
Задание.
Разработайте класс, реализующий линейный односвязный список. Методы класса: вставка элемента после n-го элемента списка, просмотр списка, удаление из списка каждого второго элемента. Поля записей: номер группы, имя ребенка, его возраст, домашний адрес.

Никак не могу 'реализовать' функции
1) Удаление каждого второго элемента.
2) Вставка после n-ного элемента.

Правда есть идеи... вот код.

Код:
#include<conio.h>
#include<windows.h>
#include<iostream.h>

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

class group
{
public:
    struct student
    {
        char group[5];
        char name[20];//&#239;&#238;&#235;&#229; &#241;&#226;&#255;&#231;&#238;&#234;
        char vozrast[20];
        char home[80];
        student *next;
    } *begin,*begin1,*rex,*end;
   
    group();
    ~group();
   
    void add(void);
    void del(void);
    void show(void);
    void menu(void);
}g;

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

main()
{
    g.menu();
    return 0;
}

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

void group::menu(void)
{
    int key=0;
    begin1=begin;

    do
    {
        cout<<"\nYou can: 1-Add member\n2-Delete every second members\n3-Show members\n\n";
        key=getch();
        switch(key)
        {
        case 49: add(); break;
        case 50: del(); break;
        case 51: show();
        }
    }
    while(key!=27);
    system("cls");
}

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

void group::add(void)
{
    system("cls");
    rex=new student;   

    cout<<"group: ";cin>>rex->group;
    cout<<"name: ";cin>>rex->name;
    cout<<"vozrast: ";cin>>rex->vozrast;
    cout<<"home: ";cin>>rex->home;

    if(begin==NULL)
        begin=rex;
    else
        end->next=rex;

    end=rex;
    end->next=NULL;
}

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

void group::del(void)
{
     if(begin==NULL)
     {
          cout<<"Empty"<<endl;
          return;
     }
     
     rex=begin;
     begin=begin->next;
     delete rex;
}

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

void group::show(void)
{
    system("cls");
    if (begin==NULL)
    {
        cout<<"Empty"<<endl;
        return;
    }
   
    rex=begin;
   
    while(rex!=NULL)
    {
        cout<<"group:"<<rex->group<<endl;
        cout<<"name:"<<rex->name<<endl;
        cout<<"vozrast:"<<rex->vozrast<<endl;
        cout<<"home:"<<rex->home<<endl<<endl;
        rex=rex->next;
    }
}

//----------------------------------------------------
group::group()
{
    begin=end=NULL;
}

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

group::~group()
{
    while(begin!=NULL)
    {
        rex=begin;
        begin=begin->next;
        delete rex;
    }
}


По поводу идей:
1) Удаление каждого второго элемента.

пытался сделать так:

функция удаления:
Код:
if(begin1->next!=NULL)
           rex=begin1->next;
      else
           return;

     if(begin1->next->next!=NULL)
         begin1=begin1->next->next;
    else
          return;

           delete rex;


при этом begin1=begin (в главной ф-ции присвоил). компилятор написал ошибку памяти, при этом дебаггером прошёлся пошагово и ошибка была в первой же строчке, работающей с указателем begin1.

 
Код:
if(begin1->next->next!=NULL)
begin1=begin1->next->next;


может быть я неверно объявил? объявлял в конце структуры после } (Как и begin,end и т.п.), в main() присваивал адрес указателю begin1 в самом начале. В чём дело... до сих пор думаю.

2) Вставка после n-ного элемента. Мысль только одна - считать количество элементов и отсчитывать от последнего.

-------------------------------------------

Буду очень рад любым советам, накидаю плюсов тому, кто исправит мною данную программу и скажу огромедное спасибо. Советам тоже рад :) Просто провёл бессонную ночь над такой маленькой программой, а обидно.

PS: Использую Visual C++ 6.0
320
08 марта 2007 года
m_Valery
1.0K / / 08.01.2007
Как то делали списки тут.Lerkin делал односвязный список.Может подчерпнешь что то полезное.
14K
08 марта 2007 года
demonoide
30 / / 11.02.2007
Посмотрел, но там работа с началом и концом списка, а у мне надо с внутренней частью, - каждый второй, после n'ного. Есть ещё предложения?
355
09 марта 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
Код:
void group::del(void)
{
    if(begin==NULL)
    {
        cout<<"Empty"<<endl;
        return;
    }

    student* first = begin;
    student* second = begin->next;
    while (first && first->next)
    {
        first->next = second->next;
        delete second;
        first = first->next;
        if (first)
            second = first->next;
    }
}


вставка после i-того: фором бежишь по списку на i-1 элементов. потом вставляешь элемент. для вставки элемента -- просто перебрасываешь ссылки у (i-1)-го элемента и у того, который вставляешь
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог