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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Fiks19
1 / 1 / 0
Регистрация: 07.01.2012
Сообщений: 44
#1

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

08.01.2013, 10:00. Просмотров 1235. Ответов 4
Метки нет (Все метки)

Не могу разобраться с выводом на экран и удалением все делаю по аналогии с различной литературой но ни чего не выходит или просто недопонимаю немного. Помогите советом.

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++
Всем привет,мое задание выглядит так : В класс List&lt;T&gt; из классной работы добавить следующие методы: void addHead(T...

Удаление элемента списка и всего списка - C++
Компилируется, но не работает. Что и как исправить? #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; #define M 5 ...

Удаление элемента из списка и поиск элемента - C++
Нужно удалить определенный элемент из списка. Найти элемент в списк и вывести на него всю информацию. Вот код. Не знаю как написать...

Удаление элемента из списка - C++
Нужно удалить всех студентов с оценками 2. Entry *begin = new Entry; int mark=2; Entry *current=begin; while(current){ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 спасибо за помощь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 14:46
Привет! Вот еще темы с ответами:

Удаление элемента из списка - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; struct FileStruct //Структура файла { ...

Удаление элемента из списка - C++
Здравствуйте, нужна помощь, программа, выполняющая следующие задания на основе двусвязного списка. Не удается удалить элемент по дате...

Удаление элемента со списка - C++
Вот у меня есть код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct OS { char Name ; ...

Удаление элемента из списка - C++
необходимо удалить первый элемент из списка, помогите пожалуйста переписать функцию и помогите с вызовом этой функции в main() ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.01.2013, 14:46
Ответ Создать тему
Опции темы

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