С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
#1

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

17.02.2013, 14:39. Просмотров 767. Ответов 16
Метки нет (Все метки)

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;
}
Суть программы однонаправленый список. Проблемы с добавлением, список все время пуст..подредактируйте кто знает в чём проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление элементов в однонаправленный список (C++):

Реализуйте однонаправленный список.Режим сортировки элементов списка без перестановки самих элементов - C++
Реализуйте задание .В каждом из вариантов должно быть реализованы следующие режимы работы: • добавление элементов; • просмотр...

Построить однонаправленный список из элементов файла - C++
Помогите составить программу, которая строит однонаправленный список из элементов файла. Элементы списка вывести на экран.

Линейный однонаправленный список. Удаление элементов - C++
Создать линейный однонаправленный список. Удалить из него все символы 'p' перед символом 'a'. Вывести список после ввода символов и после...

Однонаправленный список элементов (удвоить каждый элемент списка) - C++
Сформировать однонаправленный список элементов типа char и написать программу следующих операций над ним: а) удвоить каждый элемент списка.

Однонаправленный список из квадратов отрицательных элементов первого списка - C++
Создать однонаправленный список действительных чисел, который может содержать как положительные так и отрицательные числа. Создать...

Линейный однонаправленный список. Описать процедуру добавления одного или нескольких элементов - C++
Читая целые числа из текстового файла, создать линейный односвязный список. Описать процедуру добавления одного или нескольких ...

16
ya_noob
_
203 / 147 / 9
Регистрация: 08.10.2011
Сообщений: 432
17.02.2013, 15:02 #2
функция добавления в список занимает от силы строк 5-7. Вы же растянули ее на 25 строк. С остальными функциями то же самое. Переписывайте всё заново. Никто не будет разбираться в этом бреде.
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 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;
   }
}
1
Миниатюры
Добавление элементов в однонаправленный список  
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 18:30  [ТС] #4
Цитата Сообщение от gazlan Посмотреть сообщение
Подредактировал.
Спасибо.
Но не подскажите что в моем коде не так?
Большое спасибо!!!
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
17.02.2013, 18:50 #5
Цитата Сообщение от bohdan_si Посмотреть сообщение
что в моем коде не так?
Много всего. Начиная с неряшливого стиля (==NULL,!=NULL - вы что, на бейсике пишете?), отсутствия обнуления освобожденных указателей (вы не один такой, весь Linux так написан) непродуманного использования переменных и структуры кода, и кончая отсутствием деструктора - аллокированная вашим списком память никогда не освобождается.
1
Kuzia domovenok
2061 / 1906 / 176
Регистрация: 25.03.2012
Сообщений: 6,568
Записей в блоге: 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;
}
В чём смысл последней строки???
1
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 20:03  [ТС] #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В чём смысл последней строки???
очистить память а потом = null но зачем?
0
ya_noob
_
203 / 147 / 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
0
bohdan_si
12 / 12 / 2
Регистрация: 03.10.2012
Сообщений: 83
17.02.2013, 20:42  [ТС] #9
Цитата Сообщение от ya_noob Посмотреть сообщение
Объясните, почему вы проверяете на ноль указатель после выделения памяти? Ведь если эта версия оператора new не может выделить память, то она выкидывает исключение bad_alloc
проверяется выделались память! возможно будет случай что ее будет не достаточно и не выделится!
0
ya_noob
_
203 / 147 / 9
Регистрация: 08.10.2011
Сообщений: 432
17.02.2013, 20:45 #10
перечитывайте мой вопрос из предыдущего поста до полного понимания
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
17.02.2013, 22:15 #11
После delete temp функция завершает работу и никто никогда не узнает
Сегодня - завершает. Завтра там может быть дописан еще кусок кода в котором будет использован именно этот - ведущий в никуда - указатель. Когда я тестировал библиотеки Linux на утечки Valgrind'ом, из них десятками торчали необнуленные указатели - именно потому что их авторы посчитали "бредом" элементарное требование прибрать за собой.

если эта версия оператора new
Что значит _эта_ версия?
new может быть как угодно переопределен, выделять память из хипа, на стеке, из моего собственного пула - и не выбрасывать никаких исключений. См. http://www.cplusplus.com/reference/new/operator%20new
0
ya_noob
_
203 / 147 / 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?
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 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
0
ya_noob
_
203 / 147 / 9
Регистрация: 08.10.2011
Сообщений: 432
18.02.2013, 12:45 #14
Я писал предыдущий пост на основе вашей ссылки
Цитата Сообщение от gazlan Посмотреть сообщение
где четко говорится какое поведение должно быть у каждой версии new, а теперь вы опровергаете то, что сами посоветовали почитать. я вас не понимаю
0
Kuzia domovenok
2061 / 1906 / 176
Регистрация: 25.03.2012
Сообщений: 6,568
Записей в блоге: 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 (указатель обнулён)
0
18.02.2013, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2013, 13:04
Привет! Вот еще темы с ответами:

Добавить в список элемент после элемента с заданным инф.полем [Однонаправленный список] - C++
Вообщем есть: Функция создание списка Функции вывода на экран Функция добавление элемента с номером k А нужно ввести...

Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) - C++
Здравствуйте! Помогите написать программу, обеспечивающую работу с двунаправленным нециклическим списком: добавление/удаление элементов в...

Добавление в элементов в список - C++
Всем привет. Не могу в чем проблема. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; struct...

Добавление элементов в список - C++
Добрый вечер господа, вобщем написал я тут список, вот такой: #include &lt;vcl.h&gt; #pragma hdrstop #pragma argsused #include...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.