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

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

Войти
Регистрация
Восстановить пароль
 
GamerPro
6 / 6 / 3
Регистрация: 16.03.2014
Сообщений: 86
#1

Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру - C++

16.03.2014, 16:58. Просмотров 450. Ответов 6
Метки нет (Все метки)

Всем привет, не знаю создавалась ли подобная тема (нашел кое что похожее но не помогло)
Столкнулся с проблемой, никак не могу сделать функцию для удаления строчки из структуры по заданному номеру
Запутался с указателями
Заранее спасибо за помощь

весь код, ниже
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
#include <windows.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
 
struct TRAIN
{
    char Nazv[20]; 
    int Numb; 
    char Date[10]; 
    char Time[10]; 
    void Input(TRAIN &train);  //Функция ввода данных в структуру 
    TRAIN *Next; //Адрес на следующий элемент
};
 
class List
{
        TRAIN *Head; //Указатель на начало списка
        int size;
    public:
        List():Head(NULL),size(0) {}; //Инициализация значений с помощью конструктора 
        ~List();
        void Add(TRAIN &train);
        void Show();
        void One_show(int N);
        void Del(int N);
        int Count() {return size;}; 
        
};
 
 
void TRAIN::Input(TRAIN &train)
{
    cout<<endl; 
    cout<<"Конечный пункт: "; cin.getline(Nazv,20); 
    cout<<"Номер поезда: ";cin>>Numb;  
    cin.ignore(); 
    cout<<"Дата отправления:  ";cin.getline(Date,10); 
    cout<<"Время отправления: ";cin.getline(Time,10);
}
 
 
 List::~List() 
{
        while (Head!=NULL) //Пока по адресу есть что-то
        {
            TRAIN *temp=Head->Next; //запоминаем указатель на адрес следующего элемента структуры
            delete Head; //Освобождаем память по месту начала списка
            Head=temp; //Меняем адрес начала списка
        }
}
 
 
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ НОВОЙ СТРУКТУРЫ В СПИСОК*/
 void List::Add(TRAIN &train)
 {     size++;
       TRAIN *temp=new TRAIN; //Выделение памяти под новую структуру
       temp->Next=Head; //Указываем, что адрес следующего элемента это начало списка
//Копирование содержимого параметра student в только что созданную переменную
       strcpy_s(temp->Nazv,train.Nazv);
       temp->Numb=train.Numb;
       strcpy_s(temp->Date,train.Date);
       strcpy_s(temp->Time,train.Time);
       Head=temp; //Смена адреса начала списка
 }
 
 
 
 void List::Show()
 {
     TRAIN *temp=Head; //Объявляем указатель и изначально он указывает на начало
     if ((Head!=NULL)&&(size>0)){
     cout << "-----------------------------------------------------------------------------\n";
     cout << "|| Конечный пункт || Номер поезда || Дата отпарвления || Время отправления ||\n";
     cout << "-----------------------------------------------------------------------------\n";
     while (temp!=NULL) //Пока по адресу на начало хоть что-то есть
     {
         cout<<"||"<<setw(16)<<temp->Nazv<<"||"; 
         cout<<setw(14)<<temp->Numb<<"||"; 
         cout<<setw(18)<<temp->Date<<"||"; 
         cout<<setw(19)<<temp->Time<<"||"<<endl; 
         temp=temp->Next; //Указываем на следующий адрес из списка
     }
     cout << "-----------------------------------------------------------------------------\n\n";
     }
     else
     {
     cout << "Структура - пустая\n\n";
     }
 }
 
void List::One_show(int N) 
{
    TRAIN *temp=Head; //Обращаемся к началу списка
    if ((Head!=NULL)&&(N<size)) //Делаем проверку на то что список не пуст и N не превышает число его элементов
        {
                 cout << "-----------------------------------------------------------------------------\n";
                 cout << "|| Конечный пункт || Номер поезда || Дата отпарвления || Время отправления ||\n";
                 cout << "-----------------------------------------------------------------------------\n";
            for (int i=0;i<N;i++) temp=temp->Next; //Меняем адрес N раз
                 cout<<"||"<<setw(16)<<temp->Nazv<<"||"; 
                 cout<<setw(14)<<temp->Numb<<"||"; 
                 cout<<setw(18)<<temp->Date<<"||"; 
                 cout<<setw(19)<<temp->Time<<"||"<<endl; 
                 cout << "-----------------------------------------------------------------------------\n\n";
        }
    else{cout << "\nПустая строка (Неверная)\n\n";}
}
 
void List::Del(int N) 
{
    TRAIN *temp=Head; //Обращаемся к началу списка
    if ((Head!=NULL)&&(N<size)) //Делаем проверку на то что список не пуст и N не превышает число его элементов
        {    
            for (int i=0;i<N;i++) temp=temp->Next; //Меняем адрес N раз
                
                TRAIN *temp=Head->Next; //запоминаем указатель на адрес следующего элемента структуры
                delete temp; //Освобождаем память по месту начала списка
                Head=temp; //Меняем адрес начала списка
                size--;
                
        }
    else{cout << "\nМы будем воздух удалять?!?\n\n";}
}
 
 
 
 
int main ()
{
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      TRAIN train; //Обяъвили переменную, тип которой ПОезд
      int N, key;  
      List lst; //Объявили переменную типа Список. Она выступает как контейнер данных       
      met:
      
      cout<< "Меню:\n" << "(1) - Добавить поезд в расписание\n" << "(2) - Вывести все поезда\n"<< "(3) - Вывести один поезд\n"<< "(4) - Удалить один поезд\n\n"<< "(0) - Завершыть работу\n\n" << "Ваш выбор: " ;
      cin >> key;
      switch (key)
        {
        case 0: break;
        case 1:
            cout<<"\nВведите к-во поездов: ";cin>>N;
            cin.ignore();
            for (int i=0;i<N;i++)
                {
                     train.Input(train); //Передаем в функцию заполнения переменную поезд
                     lst.Add(train); //Добавляем заполненную структуру в список
                }
            goto met;
            break;
        case 2:
            cout<<endl;
            lst.Show(); //Показываем список на экране
            goto met;
            break;
        case 3:
            cout<<"\nВведите номер елемента: ";cin>>N;
            N-=1;
            cin.ignore();
            lst.One_show(N);
            goto met;
            break;
        case 4:
            cout<<"\nВведите номер елемента для удаления: ";cin>>N;
            N-=1;
            cin.ignore();
            lst.Del(N);
            goto met;
            break;
        default:
            cout << "Ошибка ввода\n\n";
            goto met;
            break;
        }
        
}
Добавлено через 4 часа 0 минут
Помогите пж, на завтра нужен готовый код
Никак не выходит
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 16:58     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру
Посмотрите здесь:

Структуры и односвязные списки - C++
Помогите с задачей. Заранее спасибо. &quot;Сформировать список из натуральных чисел. Заменить максимальные элементы списка числом...

Динамические структуры данных. Односвязные списки - C++
Вот код. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;iostream&gt; using namespace std; const int k = 101;...

Написать функцию сортировки по заданному полю для структуры User - C++
Помогите сделать сортировку в структуре по полю surname любым способом #define _CRT_SECURE_NO_WARNINGS #include &lt;stdio.h&gt; #include...

Реализовать функцию поиска для структуры Книга - C++
вообщем, не знаю как сделать поиск по книге, нужно сделать так: ввожу информатика, выводит автора и год издания, попытался но вроде...

Создать очередь вещественных значений, для реализации используя односвязные списки - C++
Создать очередь вещественных значений, для реализации используя односвязные списки. Реализовать операции добавления() и удаления() элемента...

Реализовать поиск по заданному полю в массиве пользовательского типа (структуры) - C++
Для определенной пользователем структуры выполнить следующее: • Написать функцию формирования одномерного массива структур, значения...

Реализовать поиск в массиве объектов пользовательского типа по заданному полю (структуры) - C++
1) В столовой предлагается N комплексных обедов, состоящих из Q блюд. Известна стоимость и калорийность каждого блюда. Сколько стоит...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
16.03.2014, 20:39     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру #2
что ты понимаешь под "строчкой структуры по заданному номеру"?
prozac631
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 15
16.03.2014, 20:43     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Пусть number - номер строки которую надо удалить.
C++
1
2
3
Train *buf = Head;
for(int i=0;i<number-1;i++) buf = buf->next;
buf->next = buf->next->next;
Просто перезаписываешь ссылку у предыдущего элемента на следующий, после того, который надо удалить.

P.S. Написал идею. Как реализовать со своими структурами - сам разберешься.
GamerPro
6 / 6 / 3
Регистрация: 16.03.2014
Сообщений: 86
16.03.2014, 23:55  [ТС]     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру #4
prozac631, Спасибо
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
16.03.2014, 23:59     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру #5
Цитата Сообщение от prozac631 Посмотреть сообщение
buf->next = buf->next->next;
тут утечка памяти будет. Нужно запомнить указатель, на тот элемент, который удаляем, и потом сделать delete.
GamerPro
6 / 6 / 3
Регистрация: 16.03.2014
Сообщений: 86
17.03.2014, 00:11  [ТС]     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру #6
Не вдавался в подробности, но в целом работает, fishec, спасибо, гляну
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2014, 18:25     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру
Еще ссылки по теме:

Реализовать поиск по заданному полю в массиве объектов ползовательского типа (структуры) - C++
Здравствуйте, помогите разобраться как решать данную задачу, заранее спасибо! Дан массив записей, содержащий сведения о товарах:...

Реализовать сортировку массива объектов пользовательского типа по заданному полю (структуры) - C++
Есть перечень студентов, прибывших в лагерь по форме: ФИО, факультет, номер отряда. Упорядочить перечень по номерам отрядов, внутри отряда...

Реализовать поиск по заданному полю в массиве объектов ползовательского типа (структуры) - C++
Задача: Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим...

Реализовать функцию удаления пробелов из заданной строки - C++
есть программа которая удаляет пробелы, но нужно написать ее так что бы она работала через 2 функции но как? загадка 1- для main -...

Односвязные списки - C++
Вот такая задачка Дан текстовый файл. Группы символов, разделенные пробелами, будем называть словами. В файле оставить только по...


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

Или воспользуйтесь поиском по форуму:
GamerPro
6 / 6 / 3
Регистрация: 16.03.2014
Сообщений: 86
24.03.2014, 18:25  [ТС]     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру #7
Если кому то нужно, вот
Полноценный односвязный список

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
#include <windows.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
 
struct TRAIN
{
    char Nazv[30]; 
    int Numb; 
    char Date[20]; 
    char Time[20]; 
    void Input(TRAIN &train);  //Функция ввода данных в структуру 
    TRAIN *Next; //Адрес на следующий элемент
};
 
class List
{
        TRAIN *Head; //Указатель на начало списка
        int size;
    public:
        List():Head(NULL),size(0) {}; 
        ~List();
        void Add(TRAIN &train);
        void Show();
        void One_show(int N);
        void Del(int N);
        int Count() {return size;}; 
        
};
 
 
void TRAIN::Input(TRAIN &train)
{
    cout<<endl; 
    cout<<"Конечный пункт: "; cin.getline(Nazv,30); 
    cout<<"Номер поезда: ";cin>>Numb;  
    cin.ignore(); 
    cout<<"Дата отправления:  ";cin.getline(Date,20); 
    cout<<"Время отправления: ";cin.getline(Time,20);
}
 
 
 List::~List() 
{
        while (Head!=NULL) //Пока по адресу есть что-то
        {
            TRAIN *temp=Head->Next; //запоминаем указатель на адрес следующего элемента структуры
            delete Head; //Освобождаем память по месту начала списка
            Head=temp; //Меняем адрес начала списка
        }
}
 
 
 
 
 void List::Add(TRAIN &train)
 {     size++;
       TRAIN *temp=new TRAIN; //Выделение памяти под новую структуру
       temp->Next=Head; //Указываем, что адрес следующего элемента это начало списка
       strcpy_s(temp->Nazv,train.Nazv);
       temp->Numb=train.Numb;
       strcpy_s(temp->Date,train.Date);
       strcpy_s(temp->Time,train.Time);
       Head=temp; //Смена адреса начала списка
 }
 
 
 
 void List::Show()
 {
     TRAIN *temp=Head; //Объявляем указатель и изначально он указывает на начало
     if ((Head!=NULL)&&(size>0)){
     cout << "-----------------------------------------------------------------------------\n";
     cout << "|| Конечный пункт || Номер поезда || Дата отпарвления || Время отправления ||\n";
     cout << "-----------------------------------------------------------------------------\n";
     while (temp!=NULL) //Пока по адресу на начало хоть что-то есть
     {
         cout<<"||"<<setw(16)<<temp->Nazv<<"||"; 
         cout<<setw(14)<<temp->Numb<<"||"; 
         cout<<setw(18)<<temp->Date<<"||"; 
         cout<<setw(19)<<temp->Time<<"||"<<endl; 
         temp=temp->Next; //Указываем на следующий адрес из списка
     }
     cout << "-----------------------------------------------------------------------------\n\n";
     }
     else
     {
     cout << "Структура - пустая\n\n";
     }
 }
 
void List::One_show(int N) 
{
    TRAIN *temp=Head; //Обращаемся к началу списка
    if ((Head!=NULL)&&(N<size)) //Делаем проверку на то что список не пуст и N не превышает число его элементов
        {
                 cout << "-----------------------------------------------------------------------------\n";
                 cout << "|| Конечный пункт || Номер поезда || Дата отпарвления || Время отправления ||\n";
                 cout << "-----------------------------------------------------------------------------\n";
            for (int i=0;i<N;i++) temp=temp->Next; //Меняем адрес N раз
                 cout<<"||"<<setw(16)<<temp->Nazv<<"||"; 
                 cout<<setw(14)<<temp->Numb<<"||"; 
                 cout<<setw(18)<<temp->Date<<"||"; 
                 cout<<setw(19)<<temp->Time<<"||"<<endl; 
                 cout << "-----------------------------------------------------------------------------\n\n";
        }
    else{cout << "\nПустая строка (Неверная)\n\n";}
}
 
void List::Del(int N) 
{
    TRAIN *temp=Head; //Обращаемся к началу списка
    if ((Head!=NULL)&&(N<size)) //Делаем проверку на то что список не пуст и N не превышает число его элементов
        {    
            for (int i=0;i<N-1;i++) temp=temp->Next; //Меняем адрес N раз
                TRAIN *tmp=temp->Next;
 
            if(temp->Next==NULL){}
                else
                temp->Next = temp->Next->Next;
                size--;
                delete tmp;
                
        }
    else{cout << "\nМы будем воздух удалять?!?\n\n";}
}
 
 
int main ()
{
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      TRAIN train; //Обяъвили переменную, тип которой ПОезд
      int N, key;  
      List lst; //Объявили переменную типа Список. Она выступает как контейнер данных       
      met:
      
      cout<< "\n\n---------------------------------\nМеню:\n" << "(1) - Добавить поезд в расписание\n" << "(2) - Вывести все поезда\n"<< "(3) - Вывести один поезд\n"<< "(4) - Удалить один поезд\n\n"<< "(0) - Завершыть работу\n\n" << "Ваш выбор: " ;
      cin >> key;
      switch (key)
        {
        case 0: break;
        case 1:
            cout<<"\nВведите к-во поездов: ";cin>>N;
            cin.ignore();
            for (int i=0;i<N;i++)
                {
                     train.Input(train); //Передаем в функцию заполнения переменную поезд
                     lst.Add(train); //Добавляем заполненную структуру в список
                }
            goto met;
            break;
        case 2:
            cout<<endl;
            lst.Show(); //Показываем список на экране
            goto met;
            break;
        case 3:
            cout<<"\nВведите номер елемента: ";cin>>N;
            N-=1;
            cin.ignore();
            lst.One_show(N);
            goto met;
            break;
        case 4:
            cout<<"\nВведите номер елемента для удаления: ";cin>>N;
            N-=1;
            cin.ignore();
            lst.Del(N);
            goto met;
            break;
        default:
            cout << "Ошибка ввода\n\n";
            goto met;
            break;
        }
        
}
Yandex
Объявления
24.03.2014, 18:25     Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру
Ответ Создать тему
Опции темы

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