Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Cвязной список / 22 сообщений из 22, страница 1 из 1
19.03.2005, 13:21
    #32969553
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
я создаю связной список , определяю 2 объекта , ввожу данные
а когда распечатываю то 2й объект содержит данные первого.
почему ?
...
Рейтинг: 0 / 0
19.03.2005, 13:50
    #32969570
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Marik_1973я создаю связной список , определяю 2 объекта , ввожу данные
а когда распечатываю то 2й объект содержит данные первого.
почему ?

Вы только что зарегистрировались? Тогда я напомню правила. В этом форуме принято вопрос дополнять фрагментом исходника. А то знаете-ли флейм получится...
...
Рейтинг: 0 / 0
19.03.2005, 13:53
    #32969575
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
это связной список .
какой кусок прог-мы прислать ?
всю ?
...
Рейтинг: 0 / 0
19.03.2005, 14:08
    #32969582
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Всю необязательно. Хотя-бы самодостаточный фрагмент начиная от создания списка и заканчивая распечатыванием.
...
Рейтинг: 0 / 0
19.03.2005, 14:12
    #32969587
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Set *Set::newelement(int num) //*** Set up new record
{
Set *element; // Address of new record

element = new Set;
// Create memory space for new record
if (element != NULL) // Be sure memory can be allocated
{
element->number=num;
// element->next = NULL;
}
else
cout << "Not enough memory!" << endl;
return element;
}

/////////////////////////////////////////////////////////////
void Set::add(int num) //*** Insert new record into list
{ Set *element; // Address of new record

element = newelement(num);
if (element != NULL) // New record created
{ Set *curr = head, // Record being examined for input
*prev = NULL; // Record before curr


while (curr != NULL // Not at end of list
&& element->number > curr->number) // number > record's
{ prev = curr; // Save current record address
curr = curr->next; // Go to next record
}
element->next = curr; // Insert in front of current record
if (prev == NULL) // No previous record
head = element; // head in list
else
prev->next = element; // One before points to this
}
else
cout << "Can't create new record." << endl;
}

///////////////////////////////////////////////////////////////////////////////////////////
int main(void) ///// Main Program
{
Set set1,set2;
cout<<"set1:"<<endl;
set1.add(1);
set1.add(3);
set1.print();
cout<<"set2:"<<endl;
set2.add(0);
set2.add(2);
set2.add(5);
set2.add(8);
set2.print();
}
...
Рейтинг: 0 / 0
19.03.2005, 14:50
    #32969614
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Сходу не вчитываясь в текст - вы увеены что new при недостатке памяти вернет NULL? это не malloc, new возвращать NULL _не_обязан_ (хотя может, зависит от компилятора и прагм), ему полагается выбрасывать exception если проблемы с памятью
...
Рейтинг: 0 / 0
19.03.2005, 15:26
    #32969636
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
с одним объектом set1 все работает,set2 тоже работает
но когда я вызываю set2.print() расспечатывается все числа
с первого и второго объекта.
...
Рейтинг: 0 / 0
19.03.2005, 15:35
    #32969640
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
это сам класс :
class Set ///// Set Class
{
private:
int number;
Set *next;

Set *newelement(int num); //*** Set up new record

public:
Set();
void add(int num); //*** Insert new record into list
void del(void); //*** Delete record from list
bool isMember(int num);
void print(void); //*** Print out list
int size(void);
};
...
Рейтинг: 0 / 0
19.03.2005, 15:57
    #32969653
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
где печать?
...
Рейтинг: 0 / 0
19.03.2005, 16:18
    #32969661
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
void Set::print(void) //*** Print out list
{ Set *element = head; // The head value of element is the head

cout << setiosflags(ios::left);
while (element != NULL) // The tail is not NULL
{ cout << setw(30) << element->number << setw(0)<< endl;

element = element->next; // Set element to next address
}
}


наверное проблема в глобальной переменной
class Set; // Declare existence of class
Set *head = NULL; // Declare and initialize global variable

только как по другому ее объявить ?
...
Рейтинг: 0 / 0
19.03.2005, 16:49
    #32969676
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
ты хочешь сказать что head у тебя статическая переменная?
...
Рейтинг: 0 / 0
19.03.2005, 17:15
    #32969684
Marik_1973
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
head - глобальная переменная
...
Рейтинг: 0 / 0
20.03.2005, 21:08
    #32970274
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
А чем list не угодил?

#include <list>
list<Element*> MyWorkedLinkedList;
...
Рейтинг: 0 / 0
21.03.2005, 12:06
    #32970921
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Marik_1973head - глобальная переменная
Так в этом-то и вся проблема...
Для упрощения ее решения можно внести указатель на первый элемент внутрь структуры/класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Set ///// Set Class
{ 
private:
int number;
Set *head;//Head of list (added by Stanislav S.)
Set *next;

Set *newelement(int num); //*** Set up new record

public:
Set();
void add(int num); //*** Insert new record into list
void del(void); //*** Delete record from list
bool isMember(int num);
void print(void); //*** Print out list
int size(void);
};
Затем, в конструкторе, *head=NULL, а в функции add():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
void Set::add(int num) //*** Insert new record into list
{ Set *element; // Address of new record
  Set  *prev;
element = newelement(num);
if (element != NULL) // New record created
{ 
if(head==NULL)
 {
 head = element; // head in list
 head->next=NULL;
 }
 else
{ Set *curr = head, // Record being examined for input
*prev = NULL; // Record before curr


while (curr != NULL // Not at end of list
&& element->number > curr->number) // number > record's
{ prev = curr; // Save current record address
curr = curr->next; // Go to next record
}
element->next = curr; // Insert in front of current record
prev->next = element; // One before points to this
}
}
else
cout << "Can't create new record." << endl;
}
...
Рейтинг: 0 / 0
21.03.2005, 13:57
    #32971279
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
ПРодолжаю недоумевать.
Настаиваю категорически на использовании list из STL! :)
...
Рейтинг: 0 / 0
21.03.2005, 14:14
    #32971334
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
niknameПРодолжаю недоумевать.
Настаиваю категорически на использовании list из STL! :)
Да, а вдруг человек курсовую пишет по связным спискам? Так же он никогда не узнает, что такое связные списки ( ) и с чем их едят
...
Рейтинг: 0 / 0
21.03.2005, 14:26
    #32971362
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
За эту реализацию я бы поставил 2.
Объясняю - нет метода для нахождения головы. МОжно просто потеряться.
Легко спутать указатели на два разных списка и т.д.
...
Рейтинг: 0 / 0
21.03.2005, 17:10
    #32971940
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Код: plaintext
1.
2.
3.
element = new Set;
// Create memory space for new record
if (element != NULL) // Be sure memory can be allocated
Уточню в стандарте сказано, что если new не может выделить память, то он генерит исключение. Поэтому до ваше IF дело просто не дойдет. Если же оператор new определен со спецификацией throw() то есть не генрировать исключения, то он конечно же ОБЯЗАН по стандарту вернут NULL в случае неудачи. Но во-первых, я уже давно не видел реализацией new со спецификацией throw(), во-вторых во многих современных компилерах эта спецификация throw(), просто игнорируется с выдачей варнинга. Вобчем throw() это не очень хороший стиль.

Ну если в вас так сильны привыки использования malloc/free или аля паскаль, тогда так можно писать
Код: plaintext
if (element=new Set)

Но даже если смотреть дальше - очень неверно с вашей стороны в случае неудачи сборки класса - просто выводить что-то на печать, и рабдотать как не в чем не бывало. Это усложняет код, делает головоломной отладку и усложняет сопровождение программы. Используйте в таких случаях исключение.

Во-вторых: использование глобальных переменных не очень правильно. Гораздо проще было объявить некий тип Список, а в нем внутри класс Node или Item. Пользуйтесь возможностями языка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class List
{
  struct Item
  {
    int value_;
  } *head_;
  
  void silent_free(); // throw()
public:
  List() : head_(NULL) {}
  List( List& rhs ) : head_( rhs.head ) {}
  ~List() { silent_free(); } // no throw dtor
  void clear(); // mb throw eraser

  void push_back( int v );
  // ну и т.д.
};

ну там много еще гадостей. Чичаз домой поеду -там допишу 8-)))
...
Рейтинг: 0 / 0
21.03.2005, 18:04
    #32972079
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
книжка на эту тему есть хорошая.
http://books.dore.ru/bs/f1bid1179.html
...
Рейтинг: 0 / 0
21.03.2005, 20:05
    #32972289
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Вобчем то да че рассказывать лучше показать. Как-то я упражнялся с этим делом и сохранил как раз для таких случаев.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
// class for test algo
// not for use!!!!
class SList{
public:
    
    class SListItem{
        friend class SList; // hack for unmark tail
        SListItem* next_;
    public:
        int value;

        SListItem(int i= 0 ) : value(i), next_(NULL) {}
        SListItem(SListItem* nxt, int i= 0 ) : value(i), next_(nxt) {}

        // check marked tail
        SListItem* next() const { return next_ && next_->next_ != next_ ? next_ : NULL; }
    } *head;
    
    SList() : head(NULL) {}
    ~SList() { free(head); }

    
    //for reverse or fast add items
    SListItem* push_front( int value )
    {
        return head = new SListItem( head, value );
    }

    // very slow method, mb u can save tail, but it is danger
   
    SListItem* push_back( int value )
    {
        // find tail
        for( SListItem* cur=head; cur && cur->next(); cur = cur->next() );

        return head ? insert( cur, value ) : head = insert( head, value );
    }

    SListItem* insert( SListItem* after, int value )
    {
        if( after ){
            // insert in marked tail
            if( !after->next() && after->next_ ){
                after->next_->value = value;
                after->next_->next_ = NULL;
                return after->next_;
            }

            // simple insert after
            return after->next_ = new SListItem( after->next_, value );
        }

        // new head
        return after = new SListItem( value );
    }

    SListItem* remove( SListItem* pos )
    {
        if( !pos ) // mb replace assert
            return pos;

        if( pos->next_ ){ // copy from next
            SListItem* tmp( pos->next_->next_ );
            
            pos->value = pos->next_->value;
            delete pos->next_;

            pos->next_ = tmp;
            return pos;
        } 
        
        pos->next_ = pos; // remove last
        return NULL;
    }

    SListItem* reverse()
    {
        if(!head || !head->next())
            return head;
        
        SListItem *h(NULL);

        for( SListItem *cur = head; cur; cur = cur->next() )
            h = new SListItem( h, cur->value );

        free( head );
        return head = h;
    }

private:

    // for internal use
    void free( SListItem* item )
    {
        if( !item )
            return;

        if(item->next_)
            free( item->next_ );

        delete item;
    }


    // wrong code, save as example
    
    SListItem* remove_last( SListItem* pos )
    {
        // ACHTUNG !!!!
        // THIS WRONG FUCKING CODE!!!!!
        delete pos;
        pos = NULL;

        return pos;
    }
};
...
Рейтинг: 0 / 0
21.03.2005, 20:11
    #32972300
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
все это можно переписать ЗНАЧИТЕЛЬНО оптимальней и в итераторном стиле. Там просто пара фокусов с быстрым удалением и удалением "хвоста" без использования "головы". Кстати, распространенная задачка при приеме на работу.
...
Рейтинг: 0 / 0
21.03.2005, 20:13
    #32972301
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cвязной список
Забыл предупредить - не советую использовать этот код при отправке тестов и прочего, потому как когда я отправлял свои тесты мне было сделано замечание о неаккуратности кода и безобразном стиле оформления. так что вы просто повторите мои ошибки. код привожу только для ознакомления.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Cвязной список / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]