Как удалить элемент структуры
Перейти к содержимому

Как удалить элемент структуры

  • автор:

Удалить элементы из структуры

Дали вот такое задание на С++
1. сделать Структура «Владелец автомобиля»:
— Фамилия, имя, отчество;
— Номер автомобиля;
— Номер техпаспорта;
— Отделение регистрации ГАИ.
2. Удалить элемент с указанным номером авто,
3. добавить 2 элемента перед элементом с указанным именем.

первое я сделал без проблем а вот во вторым и третьим не разберусь никак

Вот мой код, где функция deleted пытается удалить запись из структуры но что-то ничего из этого не вышло.

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
#include #include #include struct Auto { char* name; char* number; char* otdel; char* tehnumber; }; void input(Auto& Obj) { const int max_size=200; char str[max_size]; cout"Введите Имя и Фамилию\n"; cin.getline(str, max_size); Obj.name=new char[strlen(str)+1]; strcpy(Obj.name, str); cout"Введите номер машины\n"; cin.getline(str, max_size); Obj.number=new char[strlen(str)+1]; strcpy(Obj.number, str); cout"Введите отдел регистрации ДАИ\n"; cin.getline(str, max_size); Obj.otdel=new char[strlen(str)+1]; strcpy(Obj.otdel, str); cout"Введите номер тех паспорта\n"; cin.getline(str, max_size); Obj.tehnumber=new char[strlen(str)+1]; strcpy(Obj.tehnumber, str); cout'\n'; cin.get(); } void output(Auto& Obj) { cout"Фамилия Имя Отчество: " Obj.name '\n' "Номер машины: " Obj.number '\n' "Отдел регистрации ДАИ: " Obj.otdel '\n' "Номер тех паспорта: " Obj.tehnumber '\n'; cout'\n'; } void deleted(Auto* Obj, int n) { int cnt=0; const int size_find_str=7; const char str[size_find_str]="123QWE"; for(int i=0; in; ++i) { if(!(strcmp(Obj[i].number, str))) { Obj[i].name=Obj[i+1].name; Obj[i].number=Obj[i+1].number; Obj[i].otdel=Obj[i+1].otdel; Obj[i].tehnumber=Obj[i+1].tehnumber; ++cnt; } } if (cnt==0) { cout"Нет информации о водителях с номером "str; } } int main() { clrscr(); const int size=2; Auto* AuArr; AuArr=new Auto[size]; for(int i=0; isize; ++i) { cout"Введите информацию о " i+1 " водителе\n"; input(AuArr[i]); } for( i=0; isize; ++i) { cout"Информация о " i+1 " водителе\n"; output(AuArr[i]); } deleted(AuArr, size); cout"Архив водителей:\n"; for( i=0; isize; ++i) { cout"Информация о " i+1 " водителей\n"; output(AuArr[i]); } delete[] AuArr; getch(); return 0; }

получилось что и-тый элемент просто стал равен и+1 элементу. а вот как вообще удалить его я не пойму. и потом еще добавить два после указанной фамилии

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Динамические структуры данных: Удалить из списка все нулевые элементы
В работе во всех вариантах используются односвязные списки, информационная часть которых – целое.

Удалить запись из структуры
Помогите, пожалуйста, переделать функцию DeleteAuto. Она работает не правильно. Желательно без.

Удалить пользователя из структуры
И так, прошу помочь, есть вот моя структура, мне нужно как то сделать (Скорее всего через List).

541 / 446 / 162
Регистрация: 10.12.2009
Сообщений: 1,857
Вот быстро набросал алгоритм удаления, работая с вектором структур

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
#include #include #include struct Person { std::string Name; int Age; }; int main() { std::vector  Person > PerVector ( 3 ); PerVector [ 0 ].Name = "Max"; PerVector [ 0 ].Age = 18; PerVector [ 1 ].Name = "Alex"; PerVector [ 1 ].Age = 15; PerVector [ 2 ].Name = "Valera"; PerVector [ 2 ].Age = 20; for ( int index = 0; index  PerVector.size(); index++ ) std::cout  [ index ].Name  <" "  [ index ].Age  ::endl; // Удаляем 1 - го int Deleted = 0; PerVector.erase ( PerVector.begin() + Deleted ); std::cout  ::endl; for ( int index = 0; index  PerVector.size(); index++ ) std::cout  [ index ].Name  <" "  [ index ].Age  ::endl; std::cin.get(); return 0; }

Добавлено через 7 минут
В Вашем алгоритме нет удаления данных из базы, Вы только перезаписываете, что не хорошо. Используйте лучше динамические структуры данных, а именно — список или, может быть, вектор.

58 / 50 / 16
Регистрация: 23.06.2011
Сообщений: 122

подправил ваш алгоритм. использовал список структур. проверил, работает. вставлять в любую позицию при помощи функции списка insert.

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
#include #include #include #include using namespace std; struct Auto { char* name; char* number; char* otdel; char* tehnumber; }; void input(/*Auto& Obj*/listAuto> &ls) { Auto Obj; const int max_size=200; char str[max_size]; cout<"Введите Имя и Фамилию\n"; cin.getline(str, max_size); Obj.name=new char[strlen(str)+1]; strcpy(Obj.name, str); cout<"Введите номер машины\n"; cin.getline(str, max_size); Obj.number=new char[strlen(str)+1]; strcpy(Obj.number, str); cout<"Введите отдел регистрации ДАИ\n"; cin.getline(str, max_size); Obj.otdel=new char[strlen(str)+1]; strcpy(Obj.otdel, str); cout<"Введите номер тех паспорта\n"; cin.getline(str, max_size); Obj.tehnumber=new char[strlen(str)+1]; strcpy(Obj.tehnumber, str); ls.push_back(Obj); cout<'\n'; cin.get(); } void output(/*Auto& Obj*/listAuto>::iterator it) { cout<"Фамилия Имя Отчество: " <(*it).name <'\n' <"Номер машины: " <(*it).number <'\n' <"Отдел регистрации ДАИ: " <(*it).otdel <'\n' <"Номер тех паспорта: " <(*it).tehnumber <'\n'; cout<'\n'; } void deleted(/*Auto* Obj*/listAuto> &ls, int n) { int cnt=0; listAuto>::iterator it = ls.begin(); const int size_find_str=7; const char str[size_find_str]="123QWE"; for(int i=0; in; ++i) { if((strcmp((*it).number, str)) == 0) { ls.erase(it); ++cnt; break; /*Obj[i].name=Obj[i+1].name; Obj[i].number=Obj[i+1].number; Obj[i].otdel=Obj[i+1].otdel; Obj[i].tehnumber=Obj[i+1].tehnumber; ++cnt;*/ }else { it++; } } if (cnt==0) { cout<"Нет информации о водителях с номером "; } } int main() { clrscr(); setlocale(0,""); const int size=2; listAuto> auto_list; listAuto>::iterator it = auto_list.begin(); //Auto* AuArr; //AuArr=new Auto[size]; for(int i=0; isize; ++i) { cout<"Введите информацию о " +1 <" водителе\n"; input(/*AuArr[i]*/auto_list); } it = auto_list.begin(); for(int i=0; iauto_list.size(); ++i) { cout<"Информация о " +1 <" водителе\n"; output(/*AuArr[i]*/it); it++; } deleted(auto_list, size); cout<"Архив водителей:\n"; it = auto_list.begin(); for(int i=0; iauto_list.size(); ++i) { cout<"Информация о " +1 <" водителе\n"; output(/*AuArr[i]*/it); it++; } //delete[] AuArr; getch(); return 0; }

Добавлено через 2 минуты
не обновил страницу, не видел сообщения от Михаила. но надеюсь, что тоже был чем-то полезен..))

Добавлено через 22 часа 0 минут
в этом коде уже реализована вставка в любую позицию перед определенным именем.

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
#include #include #include #include using namespace std; struct Auto { char* name; char* number; char* otdel; char* tehnumber; }; void input(/*Auto& Obj*/listAuto> &ls) { Auto Obj; const int max_size=200; char str[max_size]; cout<"Введите Имя и Фамилию\n"; cin.getline(str, max_size); Obj.name=new char[strlen(str)+1]; strcpy(Obj.name, str); cout<"Введите номер машины\n"; cin.getline(str, max_size); Obj.number=new char[strlen(str)+1]; strcpy(Obj.number, str); cout<"Введите отдел регистрации ДАИ\n"; cin.getline(str, max_size); Obj.otdel=new char[strlen(str)+1]; strcpy(Obj.otdel, str); cout<"Введите номер тех паспорта\n"; cin.getline(str, max_size); Obj.tehnumber=new char[strlen(str)+1]; strcpy(Obj.tehnumber, str); ls.push_back(Obj); cout<'\n'; cin.get(); } void output(/*Auto& Obj*/listAuto>::iterator it) { cout<"Фамилия Имя Отчество: " <(*it).name <'\n' <"Номер машины: " <(*it).number <'\n' <"Отдел регистрации ДАИ: " <(*it).otdel <'\n' <"Номер тех паспорта: " <(*it).tehnumber <'\n'; cout<'\n'; } void insert_new (listAuto> &ls, char *name, Auto driver_info) { bool yes = false; int position = 0; listAuto>::iterator it = ls.begin(); for (it = ls.begin(); it != ls.end(); it++) { if (strcmp((*it).name, name) == 0) { yes = true; break; } } if (yes) ls.insert(it,driver_info); else cout<"Нет в бвзе водителей с именем "; } void deleted(/*Auto* Obj*/listAuto> &ls, int n) { int cnt=0; listAuto>::iterator it = ls.begin(); const int size_find_str=7; const char str[size_find_str]="123QWE"; for(int i=0; in; ++i) { if((strcmp((*it).number, str)) == 0) { ls.erase(it); ++cnt; break; /*Obj[i].name=Obj[i+1].name; Obj[i].number=Obj[i+1].number; Obj[i].otdel=Obj[i+1].otdel; Obj[i].tehnumber=Obj[i+1].tehnumber; ++cnt;*/ }else { it++; } } if (cnt==0) { cout<"Нет информации о водителях с номером "; } } int main() { clrscr(); setlocale(0,""); const int size=2; listAuto> auto_list; listAuto>::iterator it = auto_list.begin(); //Auto* AuArr; //AuArr=new Auto[size]; for(int i=0; isize; ++i) { cout<"Введите информацию о " +1 <" водителе\n"; input(/*AuArr[i]*/auto_list); } it = auto_list.begin(); for(int i=0; iauto_list.size(); ++i) { cout<"Информация о " +1 <" водителе\n"; output(/*AuArr[i]*/it); it++; } deleted(auto_list, size); /*Здесь я просто добавлю информацию о новом человеке для тестирования*/ Auto driver; driver.name = "Evgeniy"; driver.number = "1234AN"; driver.otdel = "Petrovka"; driver.tehnumber = "98264"; /*Конец записи. Теперь пробуем вставить перед Иваном*/ insert_new(auto_list, "Ivan", driver); cout<"Архив водителей:\n"; it = auto_list.begin(); for(int i=0; iauto_list.size(); ++i) { cout<"Информация о " +1 <" водителе\n"; output(/*AuArr[i]*/it); it++; } //delete[] AuArr; getch(); return 0; }

Как удалить элемент структуры

Уважаемые специалисты, посоветуйте пожалуйста, как правильно удалить из коллекции типа Фиксированная структура, а именно у ОтборСтрок табличного элемента? Если бы это была просто структура, то у нее есть метод удалить, а для фиксированной структуры — нет.

а потому и фиксированная
Её перезаписывать можно. Просто присвой другую фиксированную структуру.

Прямо из СП:
Чтобы снять отбор нужно присвоить свойству либо значение Неопределено, либо пустую ФиксированнаяСтруктура

(3) хочется не снять весь отбор (там может быть отбор по 2 колонкам), а только у одного ключа.

Большое всем спасибо, просто пересоздам фикс структуру.

1С 8.x : Структура ~ Удаление элементов, очистка структуры

Распечатать

Распечатать

Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Внешние обработки, печатные формы, обработки по заполнению табличных частей 3
Справочник «Внешние обработки, печатные формы, обработки по заполнению табличных частей» содержит список произвольных обработок, произвольных отчетов, дополнительных печатных форм, обработок для заполнения ТЧ объектов, обработок, подключаемых к отч Внешняя печатная форма, дополнительные параметры для печати 5
Внешняя обработка (Печатная форма), содержащая: Необязательный реквизит « ДополнительныеПараметры » произвольного типа , которому будут передаваться дополнительные параметры примитивного типа в виде структуры. https://helpf.pro/uploads/img/_1-Y74bX Выборка (перебор) бизнес-процессов 0
Выбрать( , , , ) отбора отбора (необязательный) — Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры — значение отбора по этому рекви Выборка (перебор) видов расчета 0
Выбрать( , ) (необязательный) — Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры — значение отбора по этому реквизиту. В качестве рекви Посмотреть все результаты поиска похожих

Еще в этой же категории

Сравнение двух структур 8
// Сравнение 2-х стурктур // Возвращает структуру с полями которые отличаются и значением из сравниваемой // Если в стСравнимое нет нужного поля,то в результат добавляется поля = Неопределенно // стОсновная, стСравнимое — сравниваемые структуры Массив ~ Как удалить повторяющиеся элементы массива? 7
Функция УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт ТекущийИндекс = 0; ВсегоЭлементов = Массив.Количество(); Пока ТекущийИндекс ВсегоЭлементов Цикл Индекс2 = ТекущийИндекс + 1; Пока Индекс2 ВсегоЭлементов Цикл Если Массив = Структура ~ Создать структуру и добавить элементы 4
// Создание структуры СозданнаяСтруктура = Новый Структура; // Создание структуры и добавление элементов СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить(» Качество» , Качество); СтруктураОтбора.Вставить(» Номенклатура» , Номенкла Структура ~ Преобразовании Структуры в Таблицу Значений 4
//Струтура в ТЗ Функция СтруктураВТЗ(Структр) ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить(» Значение» ); ТЗ.Колонки.Добавить(» Описание» ); Для Каждого ТекЭлем из Структр Цикл НовСтр=ТЗ.Добавить(); НовСтр.Значение = ТекЭлем.Ключ; НовСтр Структура ~ Перебор элементов Структуры 3
Для Каждого Элемент из СтруктураПараметров Цикл Сообщить(Элемент.Ключ + » : » + Элемент.Значение); КонецЦикла; Посмотреть все в категории Работа с Массивом, Структурой, Соответствием

Удаление элемента из массива структуры

Написать программу удаления учреждения по введенному названию из массива структур.
Я создаю структуру, но никак не могу понять как удалить один из элементов, введенное с клавиатуры
Можно через if в виде сравнения и в цикле, но не знаю как удалить найденный элемент
#include
#include
using namespace std;
struct str
char ych[40];
>;
int main()
Голосование за лучший ответ

пусть k — индекс элемента, который нужно удалить, или n, если такового нету
for (int i = k; i + 1 < n; i++) m[i] = m[i+1];
>
n—;

да, и объявление счётчика цикла вне заголовка цикла — плохая практика, не нужно так делать

ХлебушекОракул (73631) 3 года назад

>> да, и объявление счётчика цикла вне заголовка цикла — плохая практика, не нужно так делать

Это вообще про какие строчки

user49912 Оракул (51161) int i, n; . for(i = 0; i < n; i++) так писали на си до появления C11 Антон КириченкоЗнаток (450) 3 года назад

user49912 Оракул (51161) во-первых, ты пропустил одну строчку из моего ответа во-вторых, ты неправильно сравниваешь строки нельзя сравнивать char*-строки через ==, так будут сравниваться указатели, а не то, что по ним лежит в стандартной библиотеке есть функция strcmp

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *