Задача: дана последовательность символов (символов 2 или более, точное кол-во заранее не известно). Известно, что 1й символ не точка, и что среди всех символов она точно есть. удалить четные элементы, если количество символов до точки нечетно, и наоборот.
Например: Дано: 1 2 3 4 5 6
Результат: 2 4 6.
Я написал все, кроме самой ПП удаления элементов. Тут я столкнулся с проблемой, если я заранее знаю кол-во элементов, я могу написать код строго под него, но как поместить это в цикл, я не знаю, и как связать условие цикла с количеством элементов...
Собственно вот мой код (знаю, что совсем не очень, но я только учусь
):
#include <stdio.h>
FILE *fp;
struct elem
{ char el;
elem * next;};
void del (elem **p, int kol) // удаление, которое еще не готово
{
}
int shet ()//подсчет элементов
{
int i = 0; //i - количество символов до точки
char ch;
fscanf(fp,"%c", &ch);
while(ch != '.')
{
i++;
fscanf(fp,"%c",&ch);
}
return i;
}
void vvod (int kol, elem *p) // ввод структуры
{
elem *r = p;
char c; //выделение новой памяти
fseek(fp, 0, SEEK_SET); // установка указателя на начало файла
fscanf(fp, "%c", &c); //скан первого элемента
for (int i =0; i < kol; i++)
{
r -> el = c; // присваивание информационному полю значения (оно тоже указатель)
if (i < kol - 1) // выделение памяти под следующий элемент, если он есть
r -> next = new elem;
else //если его нет, то закрыть нулом
r->next = NULL;
r = r -> next; //перевод указателя на следующий элемент
fscanf(fp, "%c", &c);//скан следующего элемента
}
}
void main ()
{
elem * p;
fp = fopen("dannye.txt","r");//открытие файла
p = new elem;//память для первого элемента
int kol = shet();//количество символов до точки
vvod(kol, p); //ввод структуры
del(&p, kol);
}
А вот то, что я говорил, про код для заранее известного количества элементов:
(2 элемента дано)
k = k->next;
r->next = NULL;
delete r;
*p = k;
(4 элемента)
k = k->next;
delete r;
*p = k;
k = (*p) ->next;
r = k;
k = k->next;
delete r;
(*p)->next = k;
(6 элементов)
k = k->next;
delete r;
*p = k;
k = (*p) ->next;
r = k;
k = k->next;
delete r;
(*p)->next = k;
k = (*p) -> next-> next;
r = k;
k = k->next;
delete r;
(*p)->next->next = k;
Основная идея была в том, что не трогать изначальный указатель на голову структуры (р), добавить второй указатель,приравнять его к р, поменять первую связь (в р), занулить указатель на след. элемент во втором указателе, удалить второй указатель. И это все в цикле:)
так что я прошу помощи у знающих людей:)