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

Вы только что зарегистрировались? Тогда я напомню правила. В этом форуме принято вопрос дополнять фрагментом исходника. А то знаете-ли флейм получится...
...
Рейтинг: 0 / 0
Cвязной список
    #32969575
Marik_1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это связной список .
какой кусок прог-мы прислать ?
всю ?
...
Рейтинг: 0 / 0
Cвязной список
    #32969582
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всю необязательно. Хотя-бы самодостаточный фрагмент начиная от создания списка и заканчивая распечатыванием.
...
Рейтинг: 0 / 0
Cвязной список
    #32969587
Marik_1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Cвязной список
    #32969614
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сходу не вчитываясь в текст - вы увеены что new при недостатке памяти вернет NULL? это не malloc, new возвращать NULL _не_обязан_ (хотя может, зависит от компилятора и прагм), ему полагается выбрасывать exception если проблемы с памятью
...
Рейтинг: 0 / 0
Cвязной список
    #32969636
Marik_1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с одним объектом set1 все работает,set2 тоже работает
но когда я вызываю set2.print() расспечатывается все числа
с первого и второго объекта.
...
Рейтинг: 0 / 0
Cвязной список
    #32969640
Marik_1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это сам класс :
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
Cвязной список
    #32969653
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где печать?
...
Рейтинг: 0 / 0
Cвязной список
    #32969661
Marik_1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Cвязной список
    #32969676
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты хочешь сказать что head у тебя статическая переменная?
...
Рейтинг: 0 / 0
Cвязной список
    #32969684
Marik_1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
head - глобальная переменная
...
Рейтинг: 0 / 0
Cвязной список
    #32970274
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чем list не угодил?

#include <list>
list<Element*> MyWorkedLinkedList;
...
Рейтинг: 0 / 0
Cвязной список
    #32970921
Станислав 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
Cвязной список
    #32971279
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПРодолжаю недоумевать.
Настаиваю категорически на использовании list из STL! :)
...
Рейтинг: 0 / 0
Cвязной список
    #32971334
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameПРодолжаю недоумевать.
Настаиваю категорически на использовании list из STL! :)
Да, а вдруг человек курсовую пишет по связным спискам? Так же он никогда не узнает, что такое связные списки ( ) и с чем их едят
...
Рейтинг: 0 / 0
Cвязной список
    #32971362
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За эту реализацию я бы поставил 2.
Объясняю - нет метода для нахождения головы. МОжно просто потеряться.
Легко спутать указатели на два разных списка и т.д.
...
Рейтинг: 0 / 0
Cвязной список
    #32971940
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Код: 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
Cвязной список
    #32972079
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
книжка на эту тему есть хорошая.
http://books.dore.ru/bs/f1bid1179.html
...
Рейтинг: 0 / 0
Cвязной список
    #32972289
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Вобчем то да че рассказывать лучше показать. Как-то я упражнялся с этим делом и сохранил как раз для таких случаев.
Код: 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
Cвязной список
    #32972300
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
все это можно переписать ЗНАЧИТЕЛЬНО оптимальней и в итераторном стиле. Там просто пара фокусов с быстрым удалением и удалением "хвоста" без использования "головы". Кстати, распространенная задачка при приеме на работу.
...
Рейтинг: 0 / 0
Cвязной список
    #32972301
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Забыл предупредить - не советую использовать этот код при отправке тестов и прочего, потому как когда я отправлял свои тесты мне было сделано замечание о неаккуратности кода и безобразном стиле оформления. так что вы просто повторите мои ошибки. код привожу только для ознакомления.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Cвязной список
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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