Удалить элемент из списка с
Всё никак не могу понять логику удаления. Вроде как самого удаления как такового не существует (но я могу ошибаться), тогда по какой логике удаляется выбранный элемент из списка. Можете подсказать как мне решить этот вопрос? Поиск элемента сделала, а само удаление не могу понять ...
#include <stdio.h>
#include <stdlib.h>
#include <clocale>
#include <string.h>
#include <windows.h>
char s[50];
int max;
struct Elements {
char name[50],
uv[7],
group[15];
};
Elements elem[50];
Elements st;
void sort(FILE* f) { //сортировка - все выводы будут отсортированы в итоге
for (int j = 0; j < max; j++)
{
for (int i = 0; i < max - 1; i++)
{
if (strcmp(elem[i].name, elem[i + 1].name) > 0)
{
st = elem[i + 1];
elem[i + 1] = elem[i];
elem[i] = st;
}
}
}
}
void full(FILE* f) { //полный список
printf("---------------------------------\n");
printf(" Отсортированный полный список\n");
printf("---------------------------------\n");
for (int i = 0; i < max; i++) {
printf("%-12s %-7s %s\n", elem[i].name, elem[i].uv, elem[i].group);
}
}
void one_group(FILE* f) { //список по группе
printf(" Введите группу:\n"
" Проводник\n Полупроводник\n Изолятор\n");
fflush(stdin);
scanf("%s", &s);
printf("---------------------------------\n");
printf(" Отсортированный список по группе\n");
printf("---------------------------------\n");
int count = 0;
for (int i = 0; i < max; i++) {
if (strcmp(elem[i].group, s) == 0) {
printf("%-12s %-7s %s\n", elem[i].name, elem[i].uv, elem[i].group);
count++;
}
}
if (count == 0) printf(" Вещества не найдены");
}
void one_elem(FILE* f) { //вывод одного элемента
printf(" Введите название элемента:\n");
fflush(stdin);
scanf("%s", &s);
printf("---------------------------------\n");
printf(" Поиск элемента\n");
printf("---------------------------------\n");
int count = 0;
for (int i = 0; i < max; i++) {
if (strcmp(elem[i].name, s) == 0) {
printf("%-12s %-7s %s\n", elem[i].name, elem[i].uv, elem[i].group);
count++;
}
}
if (count == 0) printf(" Вещество не найдено");
}
void del_elem(FILE* f) { //удаление одного элемента
printf(" Введите название элемента:\n");
fflush(stdin);
scanf("%s", &s);
printf("---------------------------------\n");
printf(" Поиск элемента\n");
printf("---------------------------------\n");
int count = 0;
for (int i = 0; i < max; i++) {
if (strcmp(elem[i].name, s) == 0) {
//удаление
count++;
}
}
if (count == 0) printf(" Вещество не найдено");
}
int main() {
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
printf("Введите имя файла:\n");
char fname[125];
gets_s(fname);
FILE* f1;
if ((f1 = fopen(fname, "a+")) == 0)
printf("Файл не найден\n");
else {
printf(" Исходный список\n");
printf("---------------------------------\n");
printf("Название Уд.вес Проводимость\n");
printf("---------------------------------\n");
int i = 0;
while (fscanf(f1, "%s%s%s", elem[i].name, &(elem[i].uv), elem[i].group) != EOF) {
printf("%-12s %-7s %s\n", elem[i].name, elem[i].uv, elem[i].group);
i++;
}
max = i;
sort(f1);
printf("\nВыберите вариант нужного вывода:\n "
" 1) Отсортированный полный список\n "
" 2) Вещества введенной группы\n "
" 3) Поиск вещества\n "
" 4) Вещества одной группы не больше указанного уд.веса\n "
" 5) Удаление вещества\n");
int ch;
scanf("%d", &ch);
switch (ch) {
case 1:full(f1); break;
case 2:one_group(f1); break;
case 3:one_elem(f1); break;
case 4:group_and_uv(f1); break;
case 5:del_elem(f1); break;
default:printf("Некорректный ввод"); break;
}
}
}
Заранее спасибо!
Ответы (1 шт):
Автор решения: EOF
→ Ссылка
Когда в цикле найдем объект для удаления, то необходимо перенести все элементы после него на одну позицию влево. Также нужно не забыть отразить изменение размера (уменьшить переменную max).
По идее так (код не компилировал):
// удаление
for (int j = i; j < max - 1; j++)
{
elem[j] = elem[j + 1];
}
max--;