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

Удаление элемента из однонаправленного списка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Fiks19
1 / 1 / 0
Регистрация: 07.01.2012
Сообщений: 44
08.01.2013, 10:00     Удаление элемента из однонаправленного списка #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
struct list
{
  int name;
  //char name[10];
  list* next;
};
 
list* init_list(int n){
    list *beg;//указатель на первый элемент
    list *p,*r;//вспомогательные указатели
    beg=new(list);//выделяем память под первый элемент
        cout<<"\n?";
        cin>>beg->name;//вводим значение информационного поля
        beg->next=0;//обнуляем адресное поле
        p=beg;//определили конец списка путем присвоению указателю p занчение 0(указатель beg)
    for (int i = 0; i < n-1; i++) {
 
        r=new(list);//создаем новый элемент
        cout<<"\n?";
        cin>>r->name;
        r->next=0;
        p->next=r;//связываем p и r
        p=r;//ставим на r указатель p (последний элемент)
        }
return beg;//возвращаем beg как результат функции
}
 
list* del_list(list* beg,int k){
//удаление элемента с номером k из списка
 
list *p=beg;
    if(k==0)//удаление первого элемента
    {
        beg=beg->next;
        delete p;
        return beg;
    }
        //проходим по списку до элемента с номером k-1
    for(int i=1;i<k && p->next!=0;i++)
        p=p->next;
        /*если такого элемента в списке нет, то возвращаем указатель на
        начало списка в качестве результата функции*/
            if (p->next==0) return beg;
            list* r=p->next;//ставим указатель r на k-й элемент
            p->next=r->next;//связываем k-1 и k+1 элемент
            delete r;//удаляем k-й элемент из памяти
            return beg;
}
 
void print_list(list* beg)
//печать списка
{
    list* p=beg;//начало списка
    int i=0;
        while(p!=0)
        {   i++;
            cout<<p->name<<"\t";
            p=p->next;//переход к следующему элементу
        }
}
 
int main ()
 
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
    init_list(2);
    
    print_list(0);
    del_list(0,3);
 
 
 
cout << "\n";
system("pause");
}
Добавлено через 19 минут
Функции работают проблема теперь как вывести эти функции.
Ввод работает вывод и удаление нет
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 10:00     Удаление элемента из однонаправленного списка
Посмотрите здесь:

C++ Удаление элемента из списка
C++ Удаление элемента со списка
C++ Удаление элемента из середины списка
Удаление элемента из списка C++
C++ Удаление элемента из списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
08.01.2013, 12:09     Удаление элемента из однонаправленного списка #2
У функции init_list память локальная, поэтому выделять память внутри этой функции оператором new нельзя, если планируется использовать указатель и данные вне функции. После возвращения из функции указатель теряет данные. Запомните навсегда эту ошибку, так как на нее постоянно будете попадать.
Из этой ситуации есть несколько выходов
- передача указателя в функцию
- создание глобального объекта или указателя
- объявление указателя в классе и объявление функции в качестве метода класса
Fiks19
1 / 1 / 0
Регистрация: 07.01.2012
Сообщений: 44
08.01.2013, 13:27  [ТС]     Удаление элемента из однонаправленного списка #3
А можете подсказать как передать указатель в функцию.
Это получается в самом выводе нужно указатель поставить или в функции print_list (но там уже есть указатель на возвращаемое значение beg)
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
08.01.2013, 14:00     Удаление элемента из однонаправленного списка #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Извините, я ошибся.

Вот тестовая программа,к оторая показывает, как передать указатель в функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
void create_string(char** t) // передаем указатель как указатель на указатель иначе выделение памяти "не сохранится"
{
 *t  = new char[3]; // выделение памяти указателю
 (*t)[0]='a'; // присвоение значения элементу указателя
}
int main ()
{
char *f;
create_string(&f); // перед передачей в функцию берется адрес указателя
cout << "f[0]: " << f[0] << "\n";
delete []f;
}

Возвращение указателя из функции является правильным.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
char* create_string()
{
 char* t  = new char[3];
 t[0]='a';
 return t;
}
 
int main ()
{
char *f;
f = create_string();
cout << "f[0]: " << f[0] << "\n";
delete []f;
}
строка 68
C++
1
init_list(2);
Вы вызываете функцию но возвращаемое значение никуда не присваивается.
Чтобы оно присвоилось нужно объявить переменную и вызвать функцию следующим образом
C++
1
list* lp = init_list(2);

строка 18
C++
1
r=new(list);//создаем новый элемент
Это неправильно. Правильно так:
C++
1
p->next=new(list);
Вот так ваша исправленная программа будет выглядеть
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
#include <windows.h>
#include <iostream>
using namespace std;
 
struct list
{
  int name;
  //char name[10];
  list* next;
};
 
list* init_list(int n){
 list *beg;//указатель на первый элемент
 list *p,*r;//вспомогательные указатели
 beg=new(list);//выделяем память под первый элемент
 cout<<"\n?";
 cin >> beg->name;//вводим значение информационного поля
 beg->next=0;//обнуляем адресное поле
 p=beg;//определили конец списка путем присвоению указателю p занчение 0(указатель beg)
 for (int i = 0; i < n-1; i++) {
  p->next=new(list);//создаем новый элемент
  p = p->next;
  cout<<"\n?";
  cin>>p->name;
  p->next = 0;
  }
 return beg;//возвращаем beg как результат функции
}
 
list* del_list(list* beg,int k){//удаление элемента с номером k из списка
 list *p=beg;
 if(k==0)//удаление первого элемента
 {
  beg=beg->next;
  delete p;
  return beg;
 }
 //проходим по списку до элемента с номером k-1
 for(int i=1;i<k && p->next!=0;i++)
  p=p->next;
 /*если такого элемента в списке нет, то возвращаем указатель на
 начало списка в качестве результата функции*/
 if (p->next==0) return beg;
 list* r=p->next;//ставим указатель r на k-й элемент
 p->next=r->next;//связываем k-1 и k+1 элемент
 delete r;//удаляем k-й элемент из памяти
 return beg;
}
 
 
void print_list(list* beg) //печать списка
{
 list* p=beg;//начало списка
 int i=0;
 while(p!=0)
 {
  i++;
  cout<<p->name<<"\t";
  p=p->next;//переход к следующему элементу
 }
}
 
int main ()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 list* lp = init_list(2);
 print_list(lp);
 del_list(lp, 1);
 cout << "\n";
 print_list(lp);
 cout << "\n";
}
Fiks19
1 / 1 / 0
Регистрация: 07.01.2012
Сообщений: 44
08.01.2013, 14:46  [ТС]     Удаление элемента из однонаправленного списка #5
asidorchenko спасибо за помощь
Yandex
Объявления
08.01.2013, 14:46     Удаление элемента из однонаправленного списка
Ответ Создать тему
Опции темы

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