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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2013, 14:34   #11
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
чтобы объекты класса ind были в списке list?
Поменять typedef int Data на typedef ind Data, очевидно же. Вот только я бы этого не делал, а вместо этого хранил в списке указатели на ind (typedef ind* Data).
Abstraction вне форума Ответить с цитированием
Старый 24.05.2013, 15:04   #12
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Поменять typedef int Data на typedef ind Data, очевидно же. Вот только я бы этого не делал, а вместо этого хранил в списке указатели на ind (typedef ind* Data).
В итоге у меня будут объекты класса ind, в списке Node?
DerekXlive вне форума Ответить с цитированием
Старый 24.05.2013, 15:08   #13
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
В итоге у меня будут объекты класса ind, в списке Node?
Список (это list, если что) содержит элементы типа Data. Кто такой тип Data - определяется инструкцией typedef. Как скажете, так и будет. Я бы советовал хранить в списке указатели на ind, а сами объекты ind отдельно создавать в куче - но смотрите как Вам проще. Поскольку копирование объектов класса ind тривиально, можно и так и так, разница невелика.
Abstraction вне форума Ответить с цитированием
Старый 24.05.2013, 15:15   #14
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Список (это list, если что) содержит элементы типа Data. Кто такой тип Data - определяется инструкцией typedef. Как скажете, так и будет. Я бы советовал хранить в списке указатели на ind, а сами объекты ind отдельно создавать в куче - но смотрите как Вам проще. Поскольку копирование объектов класса ind тривиально, можно и так и так, разница невелика.
Я лучше сделаю указатель на класс

Abstraction скажите, а как лучше удалить элемент в списке?
Допустим Я хочу, чтобы по нажатии клавишы удалялся один объект.

Последний раз редактировалось Stilet; 30.05.2013 в 21:23.
DerekXlive вне форума Ответить с цитированием
Старый 25.05.2013, 11:30   #15
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Допустим Я хочу, чтобы по нажатии клавиши удалялся один объект.
Во-первых, "по нажатию клавиши" - это вообще не имеет отношения к коду списка. Это имеет отношение к коду, взаимодействующему с пользователем, и одно с другим путать не надо. У нас есть одна/несколько функций, которые удаляют элемент из списка - они отдельно, а есть код, который отслеживает нажатие определённой клавиши и в этом случае такую функцию вызывает - он отдельно.

Теперь собственно об удалении. Удалять можно первый или последний элемент - такая функция очень похожа на соответствующую функцию вставки. Только надо не забыть проверить, что список не пуст - раз и отдельно обработать ситуацию, когда после удаления список станет пустым - два. Удалять первый элемент чуть проще.
Важная тонкость: если список хранит указатели на объекты класса, то нужно не забыть удалить и сам объект, причём сделать это до того, как удалить указатель:
Код:
list l;
//...
//Если список не пуст
if(l != NULL){
  delete l->data; //Удалить данные первого элемента
  remove_first_from_list(&l); //Передаём указатель на l, типа list*
}
Это - самый простой вариант. Разумеется, есть вариант поинтереснее. Во-первых, можно написать функцию, которой передаётся список и индекс, и она возвращает указатель на узел, соответствующий этому индексу, или NULL, если список кончился раньше. Во-вторых, можно написать функцию удаления узла, которой передаётся список и указатель на узел, обязательно присутствующий в этом списке, и она удаляет из списка этот узел. Использование может выглядеть так:
Код:
list l;
//...
{
  node* found = get_node_in_list(&l, 17);
  if(found != NULL){
    delete found->data;
    remove_node_from_list(&l, found);
  }
}
Abstraction вне форума Ответить с цитированием
Старый 25.05.2013, 13:52   #16
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Спасибо, понял!

Код:
#include<conio.h>
#include<dos.h>
#include<graphics.h>
#include<iostream.h>
#include<stdlib.h>
class ind
{
int g,t,f,c,x,y;//t-vremya ost,i-vremya sozd,f-vremya rabotu
char s[10],r[10],p[10],z[10],v[10];
struct time i;
public:
ind()
{
f=0;
cout<<"V kakom meste razmestit indikator, vvedite koordinatu x,y";
cin>>x>>y;
cout<<"vvedite vremya deystvia indikatora,VNIMANIE!PRI VUBORE VARIANTA 2 idikator uadlitsya posle 10 sekund posle vremeni jizni\n";
cin>>t;
cout<<"chto vivodit? 1-vremya ost,2-vremya sozd(po nagatiu enter udalyaetsa,3-vremya rabotu\n";
cin>>c;
gettime(&i);
}
void vremya()
{
switch(c)
{
case 1:{itoa(t,s,10);t=t-1;outtextxy(x,y,s);if(t==0)setcolor(0);break;}
case 2:
{
itoa(i.ti_hour,r,10);
itoa(i.ti_min,z,10);
itoa(i.ti_sec,v,10);
outtextxy(x,y,r);
outtextxy(x+20,y,z);
outtextxy(x+40,y,v);
break;
}
case 3:{itoa(f,p,10);f++;outtextxy(x,y,p);break;}
default:cout<<"Oshibka";
}
}
};
typedef ind Data;
struct list
{
Data data;
list *next;
};
typedef list* head;
void add_to_list(list*l,Data item);
void main()
{
int n,i,j,GD=0,GM;
int ansv=1;
n=0;
initgraph(&GD,&GM,"");
struct time tm1,tm2;
{
cout<<"Nagmite klavishu enter,chtoby dobavit odin indikator";
for(i=0;ansv!=0;i++)
{
void add_to_list(list*l,Data item);
getch();
cout<<"Hotite li eshe dobavit object(1-da,0-net)?";
cin>>ansv;
n++;
}
for(;;)
{
gettime(&tm1);
do
{
gettime(&tm2);
if(kbhit()) if (getch()==8)
{
closegraph();return;
}
}while(tm1.ti_sec==tm2.ti_sec);
tm1=tm2;
cleardevice();

}
}
void add_to_list(list*l,Data item)
{
list* newlist= new list;
newlist->data=item;
newlist->next=NULL;
if(*l==NULL)
{*l=newlist;
return;}
else
list* cur=*l;
while(cur->next!=NULL)
cur=cur->next;
cur->next=newlist;
return;
}
Получилось что-то страшное! Я не пойму как список должен работать с классом.

Последний раз редактировалось Stilet; 30.05.2013 в 21:30.
DerekXlive вне форума Ответить с цитированием
Старый 26.05.2013, 20:11   #17
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
list* cur=*l;
Компилятор должен был ругнуться на эту строчку. Он это сделал?
Разбейте код на логические части (в том числе и визуально, блоками комментариев). Вот список и те проблемы, которые он решает (манипуляция с указателями и всё такое). Вот класс ind и те проблемы, которые он решает (чем он у Вас там занимается - не скажу чтобы это было легко понять). Вот main и те проблемы, которые он решает (взаимодействие с пользователем).

Отладьте список. Пока - на примере списка int-ов. Добейтесь того, чтобы он работал и делал всё, что от него понадобится в дальнейшем. Затем переименуйте в определении типа Data с int на ind или ind*, как решили, и больше список не трогайте.
Отладьте ind - удостоверьтесь, что его методы делают ровно то, что надо.
И потом используйте их в main.

Сейчас:
Код:
//=========== класс ind ===================
class ind
{
  //Знаете, 12 названий в одну букву - не очень хорошая идея. Запутаетесь.
  int g,t,f,c,x,y;//t-vremya ost,i-vremya sozd,f-vremya rabotu
  char s[10],r[10],p[10],z[10],v[10];
  struct time i;
public:
  //Наверное, стоит принимать x, y, t и c как аргументы конструктора.
  //Общаться с пользователем - задача main, не надо ей грузить остальных.
  ind()
  {
    f=0;
    cout<<"V kakom meste razmestit indikator, vvedite koordinatu x,y";
    cin>>x>>y;
    cout<<"vvedite vremya deystvia indikatora,VNIMANIE!PRI VUBORE VARIANTA 2 idikator uadlitsya posle 10 sekund posle vremeni jizni\n";
    cin>>t;
    cout<<"chto vivodit? 1-vremya ost,2-vremya sozd(po nagatiu enter udalyaetsa,3-vremya rabotu\n";
    cin>>c;
    gettime(&i);
  }

  void vremya()
  {
    switch(c)
    {
      case 1:{itoa(t,s,10);t=t-1;outtextxy(x,y,s);if(t==0)setcolor(0);break;}
      case 2:
      {
        itoa(i.ti_hour,r,10);
        itoa(i.ti_min,z,10);
        itoa(i.ti_sec,v,10);
        outtextxy(x,y,r);
        outtextxy(x+20,y,z);
        outtextxy(x+40,y,v);
        break;
      }
      case 3:{itoa(f,p,10);f++;outtextxy(x,y,p);break;}
      default:cout<<"Oshibka";
    }
  }
};

//================== структура "список"  =======================
typedef ind Data;
struct node //Это - УЗЕЛ списка, а не "сам" список. Помните о том, как представлять пустой список!
{
  Data data;
  node *next;
};
typedef node* list; //А вот это - список

void add_to_list(list*l,Data item);
void add_to_list(list*l,Data item)
{
  node* newlist= new node;
  newlist->data=item;
  newlist->next=NULL;
  if(*l==NULL)
  {
    *l=newlist;
    return;
  }
  //else  - не нужен. Если мы сходили по ветке if, то был return
  node* cur = *l;
  while(cur->next!=NULL)
  cur=cur->next;
  cur->next=newlist;
  return;
}

//================== А теперь - main ===========================
void main()
{
  int n,i,j,GD=0,GM;
  int ansv=1;
  n=0;
  initgraph(&GD,&GM,"");
  struct time tm1,tm2;
  {
    cout<<"Nagmite klavishu enter,chtoby dobavit odin indikator";
    for(i=0;ansv!=0;i++)
    {
      //void add_to_list(list*l,Data item); Что это? Это не вызов функции.
      getch();
      cout<<"Hotite li eshe dobavit object(1-da,0-net)?";
      cin>>ansv;
      n++;
    }
    for(;;)
    {
      gettime(&tm1);
      do
      {
        gettime(&tm2);
        if(kbhit()) if (getch()==8)
        {
          closegraph();return;
        }
      }while(tm1.ti_sec==tm2.ti_sec);
      tm1=tm2;
      cleardevice();
    }
  }
} //Кажется, тут не хватало одной закрывающей скобки
Теперь вопрос: а что Вы хотите сделать? В нынешнем варианте объект типа ind добавляется в список так:
Код:
list l=NULL; //Список, изначально пустой
ind item; //Объект

add_to_list(&l, item); //Вызвали функцию
//В конец списка l добавился узел, содержащий копию item в поле data
Abstraction вне форума Ответить с цитированием
Старый 26.05.2013, 21:02   #18
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Дальше, Я хочу вызвать метод vremya для объекта.

Код:
//void add_to_list(list*l,Data item);
Забыл указать переменную.

Abstraction подскажите пожалуйста как вызвать метод vremya для объектов класса ind в списке list?

Последний раз редактировалось Stilet; 30.05.2013 в 21:36.
DerekXlive вне форума Ответить с цитированием
Старый 28.05.2013, 15:59   #19
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Я не очень понимаю, откуда у Вас берутся затруднения.
Код:
list l = NULL;
//...
for(node* cur = l; cur!= NULL; cur=cur->next){ //Эта конструкция была в посте №9
  cur->data.vremya();
}
Abstraction вне форума Ответить с цитированием
Старый 28.05.2013, 16:29   #20
DerekXlive
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 19
По умолчанию

Спасибо большое!
DerekXlive вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
программа с использованием подпрограмм, создаёт односвязный список и вычисляет сумму положительных чисел LOVELY Паскаль, Turbo Pascal, PascalABC.NET 5 13.12.2008 01:27