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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти среднее арифметическое модулей кратных пяти элементов массива, расположенных после максимального элемента http://www.cyberforum.ru/cpp-beginners/thread755419.html
помогите написать программу а то у меня выходит бред #include <iostream.h> #include <iomanip.h> #include <math.h> #include <conio.h> void maxim (int a,int,int*,int*); int main() { int a,n,i,max,imax; cout<<"VVedite razmer massiv";
C++ Подсчет строк и очистка экрана С++ Добрый НОЧИ Возник вопрос после заполнения всего экрана (свободных строк осталось меньше пяти) – экран очищается и программа продолжает работать в верхней строке экрана. #include <iostream> main() { int str = 1; http://www.cyberforum.ru/cpp-beginners/thread755415.html
непонятная ошибка в легком коде C++
#include <iostream> #include <stdio.h> using namespace std; double power(double n, int p) { for (int i = 0; i = p; i++) {
C++ Прерывание программы по ESC C++
доброй ночи Добрался до такой вот темы Пытаюсь реализовать перехват нажатия клавиши ESC и SPACE в консольном режиме Но программа не реагирует на нажатие клавиши и продолжает упорно работать Подскажите пожалуйста функцию для остановки программы по ESC #include <iostream> const int ESC = 27;
C++ В зависимости от введенных данных вывести на экран: http://www.cyberforum.ru/cpp-beginners/thread755376.html
/* Программа должна работать до тех пор пока пользаватель не виидет слово exit причом не вашно большим или маленьким регистром принять от пользавателя имя(провиряем на букви имя) принять от пользавателя фамилию(проверить на букви) принять от пользавателя возраст(проверить на цифри функиция isNumeric()) если возвраст до 18 лет ми должни напечатать имя,фамилия,вы ребенок если возвраст от 10...
C++ Реализовать запись и чтение списка в бинарный файл у меня есть задача в котором двусвязный список из указателей на элементы моего класса. Надо реализовать запись и чтение в бинарный файл мой класс class Fraction { private: int *rational; void GetMixedView(); // метод преобразования дроби в смешанный вид void Cancellation(); // метод сокращения дроби void GetIntPart(); // метод выделения целой части дроби подробнее

Показать сообщение отдельно
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
08.01.2013, 14:00
Извините, я ошибся.

Вот тестовая программа,к оторая показывает, как передать указатель в функцию:
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";
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru