Форум программистов, компьютерный форум CyberForum.ru

Добавление элементов в однонаправленный список - C++

Восстановить пароль Регистрация
 
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 14:39     Добавление элементов в однонаправленный список #1
C++
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "stdafx.h"
#include <iostream>
#include <locale>
 
using namespace std;
struct listNode{
    char data;
    listNode *next;
};
 
class List{
    public:
        
        void add(listNode *first, char value){
            listNode *newP, *previous, *current;
            newP = new listNode;
 
            if(newP!=NULL){
                newP->data=value;
                newP->next=NULL;
 
                previous=NULL;
                current=first;
               
            while(current!=NULL && value > current->data){
                  previous=current; 
                  current=current->next;
            }
            if(previous==NULL){
                newP->next = first;
                first=newP;
            }
            else{
                 previous->next=newP;
                 newP->next=current;
            }}
            else
                cout << value << endl;
            }
        
        char del(listNode *first, char value){
            listNode *temp, *previous, *current;
            
            if(value == first-> data){
                temp = first;
                first = first -> next;
                delete(temp);
            }
                    else{
                        previous = first;
                        current= first -> next;
 
                        while (current != NULL && current->data !=value){
                               previous = current;
                               current = current->next;
                               }
             if(current != NULL){
               temp=current;
               previous->next=current->next;
               delete(temp);
               return value;
             }
                    }
               return '\0';
        }
 
        void printList(listNode* current){
            if(current==NULL)
                cout << "Список пустий.\n\n";
                else{
                    cout << "Список: ";
                    while(current != NULL){
                    cout << current->data << "->";
                        current=current->next;
                    }
                    cout << "NULL\n\n";
                }
        }
 
        /*void printList(listNode* current){
            if(current==NULL)
                cout << "Список пустий." << endl;
                else{
                    cout << "Список: " << endl;
                    while(current != NULL){
                        cout << current->data << "->" ;
                        current = current -> next;
                    }
                 printf("NULL\n\n");
                }
            }*/     
};
 
int main()
{
    List c;
    setlocale(LC_ALL, "rus");
    listNode *start=NULL;
    char item;
    int choice;
    //instructions();
    cin >> choice;
    while(choice != 0){
        switch (choice)
        {
        case 1:
            cin >> item;
            c.add(start,item);
            break;
        case 2:
            if(!(start==NULL)){
                cout << "Введіть елемент який потрібно видалити: " << endl;
                cin >> item;
                if(c.del(start, item)){
                    cout << item << "видалено" << endl;
                    }
                    else
                        cout << item << " не знайдено для видалення" << endl;
                    }
                  else
                      cout << "Список пустий" << endl;
                  break;
 
        case 3:
            c.printList(start);
            break;
        
        default :
            cout << "Incorrect data";
            break;
        }
    cin >> choice;}
    return 0;
}
Суть программы однонаправленый список. Проблемы с добавлением, список все время пуст..подредактируйте кто знает в чём проблема.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 14:39     Добавление элементов в однонаправленный список
Посмотрите здесь:

Добавление элементов в список C++
Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) C++
C++ однонаправленный список элементов (удвоить каждый элемент списка)
Линейный однонаправленный список. Описать процедуру добавления одного или нескольких элементов C++
Построить однонаправленный список из элементов файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
17.02.2013, 15:02     Добавление элементов в однонаправленный список #2
функция добавления в список занимает от силы строк 5-7. Вы же растянули ее на 25 строк. С остальными функциями то же самое. Переписывайте всё заново. Никто не будет разбираться в этом бреде.
gazlan
2859 / 1807 / 271
Регистрация: 27.08.2010
Сообщений: 4,892
Записей в блоге: 1
17.02.2013, 17:39     Добавление элементов в однонаправленный список #3
подредактируйте
Подредактировал.

C++
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
struct ListNode
{
   char        _cData;
   ListNode*   _pNext;
};
 
//////////////////////////////////////////////////////////////////////////
 
class List
{
   public:
                       
      ListNode*      _pHead; 
 
   public:
 
       List();
      ~List();
 
      void  Add   (char cValue);
      char  Remove(char cValue);
      void  Print ();
};
 
//////////////////////////////////////////////////////////////////////////
 
List::List()
{
   _pHead = NULL;
}
 
//////////////////////////////////////////////////////////////////////////
 
List::~List()
{
   if (!_pHead)
   {
      return;
   }
 
   ListNode*   pCurr = _pHead;
   ListNode*   pTemp = NULL;
 
   while (pCurr)
   {
      if (pCurr)
      {
         pTemp = pCurr;
         pCurr = pCurr->_pNext;
 
         delete pTemp;
         pTemp = NULL;
      }
   }
}
 
//////////////////////////////////////////////////////////////////////////
 
void List::Add(char cValue)
{
   ListNode*   pNode = new ListNode;
 
   if (!pNode)
   {
      // Error !
      cout << cValue << endl;
      return;
   }
 
   memset(pNode,0,sizeof(ListNode));
 
   pNode->_cData = cValue;
 
   if (!_pHead)
   {
      _pHead = pNode;
      return;
   }
   
   ListNode*   pCurr = _pHead;
 
   while (pCurr && pCurr->_pNext)
   {
      pCurr = pCurr->_pNext;
   }
 
   pCurr->_pNext = pNode;
}
 
//////////////////////////////////////////////////////////////////////////
 
char List::Remove(char cValue)
{
   if (!_pHead)
   {
      cout << "List empty\n\n";
      return 0;
   }
 
   ListNode*   pCurr = _pHead;
   ListNode*   pPrev = NULL;
 
   while (pCurr)
   {
      if (pCurr->_cData == cValue)
      {
         if (pPrev && pPrev->_pNext)
         {
            pPrev->_pNext = pCurr->_pNext;
         }
         else
         {
            _pHead = pCurr->_pNext;
         }
 
         delete pCurr;
         pCurr = NULL;
         
         return cValue;
      }
 
      pPrev = pCurr;
      pCurr = pCurr->_pNext;
   }
 
   return 0;
}
 
//////////////////////////////////////////////////////////////////////////
 
void List::Print()
{
   if (!_pHead)
   {
      cout << "List empty\n\n";
      return;
   }
 
   ListNode*   pCurr = _pHead;
 
   cout << "The List is: ";
 
   while (pCurr)
   {
      cout << pCurr->_cData << "->";
      pCurr = pCurr->_pNext;
   }
 
   cout << "NULL\n\n";
}
 
//////////////////////////////////////////////////////////////////////////
 
int main(int argc,char** argv)
{
   List     MyList;
 
   char  cItem   = 0;
   char  cChoice = 0;
 
   cout << "You choice (first letter only): (E)xit (A)dd (R)emove (P)rint: " << endl;
   cin >> cChoice;
 
   while (true)
   {
      switch (cChoice)
      {
         case 'e':
         case 'E':
         {
            return 0;
         }
         case 'a':
         case 'A':
         {
            cout << "Enter item value to add: " << endl;
            cin >> cItem;
            MyList.Add(cItem);
            break;
         }
         case 'r':
         case 'R':
         {
            cout << "Enter item value to remove: " << endl;
            cin >> cItem;
 
            if (MyList.Remove(cItem))
            {
               cout << cItem << "Selected" << endl;
            }
            else
            {
               cout << cItem << " not found in the list" << endl;
            }
         }
         case 'p':
         case 'P':
         {
            MyList.Print();
            break;
         }
         default:
         {
            cout << "Incorrect input" << endl << endl;
            break;
         }
      }
 
      cout << "You choice (first letter only): (E)xit (A)dd (R)emove (P)rint: " << endl;
      cin >> cChoice;
   }
}
Миниатюры
Добавление элементов в однонаправленный список  
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 18:30  [ТС]     Добавление элементов в однонаправленный список #4
Цитата Сообщение от gazlan Посмотреть сообщение
Подредактировал.
Спасибо.
Но не подскажите что в моем коде не так?
Большое спасибо!!!
gazlan
2859 / 1807 / 271
Регистрация: 27.08.2010
Сообщений: 4,892
Записей в блоге: 1
17.02.2013, 18:50     Добавление элементов в однонаправленный список #5
Цитата Сообщение от bohdan_si Посмотреть сообщение
что в моем коде не так?
Много всего. Начиная с неряшливого стиля (==NULL,!=NULL - вы что, на бейсике пишете?), отсутствия обнуления освобожденных указателей (вы не один такой, весь Linux так написан) непродуманного использования переменных и структуры кода, и кончая отсутствием деструктора - аллокированная вашим списком память никогда не освобождается.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
17.02.2013, 19:59     Добавление элементов в однонаправленный список #6
Цитата Сообщение от gazlan Посмотреть сообщение
отсутствия обнуления освобожденных указателей
А тут ты вообще что имел в виду???
Да, деструктора не хватает. Но выходит ты говорил о
C++
1
delete temp
что ли?
А зачем его обнулять??? бред. Это локальная переменная в функции. После delete temp функция завершает работу и никто никогда не узнает чему она там была равна. NULL или не NULL всё равно.

Ты имел в виду писать в функциях что-то вроде.
C++
1
2
3
4
5
6
char del(...){
ListNode*   pTemp;
...
delete pTemp;
pTemp=NULL;
}
В чём смысл последней строки???
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 20:03  [ТС]     Добавление элементов в однонаправленный список #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В чём смысл последней строки???
очистить память а потом = null но зачем?
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
17.02.2013, 20:17     Добавление элементов в однонаправленный список #8
Цитата Сообщение от bohdan_si Посмотреть сообщение
C++
1
2
3
4
5
void add(listNode *first, char value){
    listNode *newP, *previous, *current;
    newP = new listNode;
    if(newP!=NULL){
        newP->data=value;

Цитата Сообщение от gazlan Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
void List::Add(char cValue)
{
ListNode* pNode = new ListNode;
if (!pNode)
    {
    // Error !
    cout << cValue << endl;
    return;
    }
Объясните, почему вы проверяете на ноль указатель после выделения памяти? Ведь если эта версия оператора new не может выделить память, то она выкидывает исключение bad_alloc
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 20:42  [ТС]     Добавление элементов в однонаправленный список #9
Цитата Сообщение от ya_noob Посмотреть сообщение
Объясните, почему вы проверяете на ноль указатель после выделения памяти? Ведь если эта версия оператора new не может выделить память, то она выкидывает исключение bad_alloc
проверяется выделались память! возможно будет случай что ее будет не достаточно и не выделится!
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
17.02.2013, 20:45     Добавление элементов в однонаправленный список #10
перечитывайте мой вопрос из предыдущего поста до полного понимания
gazlan
2859 / 1807 / 271
Регистрация: 27.08.2010
Сообщений: 4,892
Записей в блоге: 1
17.02.2013, 22:15     Добавление элементов в однонаправленный список #11
После delete temp функция завершает работу и никто никогда не узнает
Сегодня - завершает. Завтра там может быть дописан еще кусок кода в котором будет использован именно этот - ведущий в никуда - указатель. Когда я тестировал библиотеки Linux на утечки Valgrind'ом, из них десятками торчали необнуленные указатели - именно потому что их авторы посчитали "бредом" элементарное требование прибрать за собой.

если эта версия оператора new
Что значит _эта_ версия?
new может быть как угодно переопределен, выделять память из хипа, на стеке, из моего собственного пула - и не выбрасывать никаких исключений. См. http://www.cplusplus.com/reference/new/operator%20new
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
18.02.2013, 07:17     Добавление элементов в однонаправленный список #12
Цитата Сообщение от gazlan Посмотреть сообщение
Что значит _эта_ версия?
Наводящий вопрос: в чем отличие между этими двумя инструкциями?
C++
1
2
ListNode*   pNode = new ListNode;
ListNode*   pNode = new ( nothrow ) ListNode;
Цитата Сообщение от gazlan Посмотреть сообщение
new может ... выделять память ... на стеке ...
Можно пример, как выделить память на стеке с помощью new?
gazlan
2859 / 1807 / 271
Регистрация: 27.08.2010
Сообщений: 4,892
Записей в блоге: 1
18.02.2013, 12:43     Добавление элементов в однонаправленный список #13
Ензщ
Цитата Сообщение от ya_noob Посмотреть сообщение
Наводящий вопрос
Можно, конечно, наивно думать, что если <del>на заборе</del> в коде написаны три буквы, то внутри именно они и есть, но и в жизни и в коде это почти всегда не так. new - самый частый и разнообразно переопределяемый оператор и, в реальности, за ним, обычно стоит собственный менеджер с собственным поведением. Вы вероятно, уже просто не застали те времена, когда new не выбрасывал даже xalloc, а _по_стандарту_ возвращал NULL.

Иными словами, поведение new - это почти всегда вопрос имплементации - какой из стандартов был использован (и если).

Скажем, я использую MFC и в начале каждого C++ файла стоит

C++
1
2
3
4
5
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Так вот, ни xalloc, ни bad_alloc, отладочная версия не выбрасывает. Разумеется, без диагностического сообщения я в ней не останусь, но это просто пример.

И еще раз - медленно - имплементация new может быть какой угодно, память может быть выделена где угодно,
а выброс исключения xalloc/bad_alloc или возврат NULL зависит от реализации.

Добавлено через 14 минут
Можно пример, как выделить память на стеке с помощью new?
Забыл написать.

Осваивайте Google: new alloca

По первой же ссылке найдете обсуждение на Stack Overflow https://www.google.ru/search?q=new+alloca
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
18.02.2013, 12:45     Добавление элементов в однонаправленный список #14
Я писал предыдущий пост на основе вашей ссылки
Цитата Сообщение от gazlan Посмотреть сообщение
где четко говорится какое поведение должно быть у каждой версии new, а теперь вы опровергаете то, что сами посоветовали почитать. я вас не понимаю
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.02.2013, 13:04     Добавление элементов в однонаправленный список #15
Цитата Сообщение от gazlan Посмотреть сообщение
Сегодня - завершает. Завтра там может быть
Не, давай всё-таки сами будем себя контролировать. Во-первых, требование обнулять указатель, звучало именно как требование, что создало бы у новичка впечатление, что для удаления объекта надо помимо delete ещё и обнулять указатель на него. Кстати, это заблуждение мне много раз встречалось. Типичный пример: деструктор какого-нибудь class array
C++
1
2
3
4
array::~array(){
  if (data) delete[] data;
  data=NULL;//ЗАЧЕМ??? ЭТО бессмысленно!
}
Во-вторых, даже если бы ты обнулил его, это свойство нигде бы не использовалось, т.е. нигде бы всё равно не проверялось if (указатель обнулён)
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
18.02.2013, 13:06     Добавление элементов в однонаправленный список #16
alloca != new. Я вас просил показать пример как выделить память на стеке с помощью new
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2013, 13:42     Добавление элементов в однонаправленный список
Еще ссылки по теме:

C++ Однонаправленный список из квадратов отрицательных элементов первого списка
C++ Добавление элементов в двухсвязный список
C++ Добавление элементов в список

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gazlan
2859 / 1807 / 271
Регистрация: 27.08.2010
Сообщений: 4,892
Записей в блоге: 1
18.02.2013, 13:42     Добавление элементов в однонаправленный список #17
Перечитайте - вдумчиво.

Я, вероятно, плохо объясняю.

Независимо от того, какой из вариантов написания оператора new использован, его поведение: выбор адресного пространства, возвращаемое значение и выбрасываемое исключение, в лучшем случае - вопрос следования одному из (заменяющих прежний) стандартов, в худшем - вопрос имплементации.

Добавлено через 35 минут
Не, давай всё-таки сами будем себя контролировать
Ребята, я устал от вас.

1. ДА! Обнуление указателя - это требование. Такое же, как стоять на красный при переходе улицы, даже если нет ни одной машины в радиусе 5 километров. Тот, кто не привык это делать _всегда_, не сделает это и для указателя с глобальной областью видимости.

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

[OT]
Я в детстве книжку читал, фантастика. Кажется, Павел Багряк. Названия уже не вспомню. А вот одна фраза оттуда запомнилась:
Приказы надо отдавать не так, чтобы их можно было понять, а так, чтобы их нельзя было не понять.
[/OT]

Так вот, я руководствуюсь правилом: писать код так, чтобы нельзя было не понять.

И если есть простое недорогое средство не выстрелить себе в ногу - я им воспользуюсь.


alloca != new. Я вас просил показать пример как выделить память на стеке с помощью new
Ну, так не поленитесь:

По первой же ссылке найдете обсуждение на Stack Overflow https://www.google.ru/search?q=new+alloca
Первая ссылка в Google: new on stack instead of heap (like alloca vs malloc) http://stackoverflow.com/questions/4...loca-vs-malloc


Well.

Больше я в этой теме НЕ отвечаю, пока не увижу что-либо конструктивное.




P.S.

И знаете, у меня тоже есть вопрос:

У вас есть время второй день доказывать мне, как плохо обнулять неиспользуемый указатель или добиваться ответа на вопрос по первой ссылке из Google, но не нашлось времени ответить топикстартеру?

ya_noob
Переписывайте всё заново. Никто не будет разбираться в этом бреде.
Yandex
Объявления
18.02.2013, 13:42     Добавление элементов в однонаправленный список
Ответ Создать тему
Опции темы

Текущее время: 23:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru