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

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

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

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

16.03.2014, 16:58. Просмотров 455. Ответов 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 минут
Помогите пж, на завтра нужен готовый код
Никак не выходит
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 16:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Односвязные списки. Реализовать функцию для удаления строчки из структуры по заданному номеру (C++):

Структуры и односвязные списки - 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++
Для определенной пользователем структуры выполнить следующее: • Написать функцию формирования одномерного массива структур, значения...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
16.03.2014, 20:39 #2
что ты понимаешь под "строчкой структуры по заданному номеру"?
0
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. Написал идею. Как реализовать со своими структурами - сам разберешься.
1
GamerPro
6 / 6 / 3
Регистрация: 16.03.2014
Сообщений: 86
16.03.2014, 23:55  [ТС] #4
prozac631, Спасибо
0
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
16.03.2014, 23:59 #5
Цитата Сообщение от prozac631 Посмотреть сообщение
buf->next = buf->next->next;
тут утечка памяти будет. Нужно запомнить указатель, на тот элемент, который удаляем, и потом сделать delete.
1
GamerPro
6 / 6 / 3
Регистрация: 16.03.2014
Сообщений: 86
17.03.2014, 00:11  [ТС] #6
Не вдавался в подробности, но в целом работает, fishec, спасибо, гляну
0
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;
        }
        
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2014, 18:25
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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