Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2009, 14:38   #1
Defo
Новичок
Джуниор
 
Регистрация: 08.03.2009
Сообщений: 2
По умолчанию Списки С\С++

требуется разработть класс, реализующий линейный односвязный список. Методы класса: просмотр списка, удаление из списка каждого второго элемента. Поля записей: номер группы, имя ребенка, его возраст, домашний адрес.

получилось как то так но при запуске получается занести в список только 2 позиции, никак не получается найти у себя ошибку, буду рад если кто то сможет помочь.

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

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

class group 
{
public:
   struct student
{
   char group[5];
   char name[50];
   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;
   begin1=begin;
   do
   {
             cout<<"\nВозможные действия:\n1-Добавить в список \n2-Удалить каждую 2ю позицию в списке\n3-Просмотреть список\n";
             key=getch();
             switch(key)
             {
             case 49: add(); break;
             case 50: del(); break;
             case 51: show();break;
             default: cout<<endl<<"Недопустимое действие"<<endl;
}
}
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;
}

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

void group::del(void)
{
if(begin==NULL)
{
cout<<"Список пуст"<<endl;
return;
}

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


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

void group::show(void)
{
   system("cls");
   if (begin==NULL)
{
cout<<"\nСписок пуст\n"<<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;
}
}
Defo вне форума Ответить с цитированием
Старый 28.08.2009, 14:56   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Исправьте функцию добавления:
Код:
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=end=rex;
  end->next = NULL;
 } 
else
 {
  end->next=rex;
  end->next->next = NULL;
  end = rex;
 }
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 28.08.2009, 15:01   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Обрати внимание-я подкорректировал
Код:
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;
 end=rex;
} else {
 end->next=rex;
 end=rex;
}
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2009, 15:09   #4
Defo
Новичок
Джуниор
 
Регистрация: 08.03.2009
Сообщений: 2
По умолчанию

Большое спасибо за подсказку.
Defo вне форума Ответить с цитированием
Старый 28.08.2009, 17:31   #5
AndreyMust19
Пользователь
 
Регистрация: 01.03.2009
Сообщений: 31
По умолчанию

Как-то у нас была курсовая на работу с односвязанным списком. Вот могу поделиться исходниками:
http://exfile.ru/56735
MyList - оригинальные файлы, создавались для Turbo C++ 2.0. В списке у элементов своя структура (Компьютеры - название, система, память, жесткий диск). Используется один класс, хотя... толку от него мало. Эти исходники я многократно проверял и испытывал.
Внимание:
Функции удаления списка надо передавать адрес, а не ссылку, так как из-за класса происходило 2 вызова деструктора. После выхода ф-ии удаления и после выхода из нашей функции. Эту ошибку я запомнил надолго - так как долго не мог понять, что причина всему - использование классов.
MyList2 - модифицированные файлы для Visual C++ 6.0. Теперь в них нет структуры элементов списка - вместо этого ты передаешь адрес буфера, содержащего элемент и его размер в байтах, а со структурой работаешь собственными функциями. Этот вариант я испытывал меньше, поскольку создавал его 2 месяца спустя, поэтому могут быть ошибки. Впрочем, сравнив оба файла MyList.cpp ты увидишь что единственное чем они отличаются - это 2-мя аргументов в функциях.
AndreyMust19 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки Chief Паскаль, Turbo Pascal, PascalABC.NET 4 03.06.2009 18:29
Списки C++ paladinn Помощь студентам 1 27.05.2009 12:31
Списки? Chainic Microsoft Office Excel 13 06.05.2009 22:53
с++ списки Blizzz Общие вопросы C/C++ 3 04.12.2008 21:19