2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Работа над структурами (на С)
Сообщение22.02.2013, 14:45 
Задача: дана последовательность символов (символов 2 или более, точное кол-во заранее не известно). Известно, что 1й символ не точка, и что среди всех символов она точно есть. удалить четные элементы, если количество символов до точки нечетно, и наоборот.
Например: Дано: 1 2 3 4 5 6
Результат: 2 4 6.
Я написал все, кроме самой ПП удаления элементов. Тут я столкнулся с проблемой, если я заранее знаю кол-во элементов, я могу написать код строго под него, но как поместить это в цикл, я не знаю, и как связать условие цикла с количеством элементов...
Собственно вот мой код (знаю, что совсем не очень, но я только учусь :-) ):
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#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 элемента дано)
Используется синтаксис C
k = k->next;
r->next = NULL;
delete r;
*p = k;

(4 элемента)
Используется синтаксис C
k = k->next;
delete r;
*p = k;
k = (*p) ->next;
r = k;
k = k->next;
delete r;
(*p)->next = k;

(6 элементов)
Используется синтаксис C
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;

Основная идея была в том, что не трогать изначальный указатель на голову структуры (р), добавить второй указатель,приравнять его к р, поменять первую связь (в р), занулить указатель на след. элемент во втором указателе, удалить второй указатель. И это все в цикле:)
так что я прошу помощи у знающих людей:)

 
 
 
 Re: Работа над структурами (на С)
Сообщение24.02.2013, 10:48 
Вот я еще для 3х элементов написал...
Используется синтаксис C
s = p->next;
        q = p->next->next;
        delete s;
        p->next = q;
        q = p;
        p = p->next;
        p = q;

и у меня еще появилась идея, а что если сделать через 2 указателя таким образом :
1й указатель - это измененный основной(просто связи изменены на новые)
2й - это указатель на элементы, которые нужно удалить
Например:
Дано: 1 2 3 4 5 6.
1й указывает на структуру 2 4 6
а 2й на структуру 1 3 5, и потом удалить его.
можете подсказать, как это возможно реализовать?

 
 
 
 Re: Работа над структурами (на С)
Сообщение24.02.2013, 14:36 
собственно вот...написал для нечетного кол-ва элементов.
Используется синтаксис C
z = p;
                for(int i = 0; i<kol/2; i++)
                {
                        r = z->next;
                        z->next = z->next->next;
                        if(z->next != NULL)
                                z = z->next;
                        delete r;
                }

а как для чета написать? я по-разному пытался, но все равно получается, как для нечетного количества...

 
 
 
 Re: Работа над структурами (на С)
Сообщение27.02.2013, 18:26 
В общем, спасибо, что не подсказали, теперь я сам разобрался:)
вот код собственно:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
FILE *fp, *fp2;

struct elem
{ char el;
elem * next;};

elem* del (elem *p, int kol) // удаление
{
   elem *z,*r;
   if (kol%2==0)
   {
       z = p;
       p=p->next;
       delete z;
   }
   r=p;
   while (p->next != NULL)
   {
       z =p->next;
       p->next=p->next->next;
       delete z;
       p=p->next;
   }
   return r;
}
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 vyvod(elem *p, int kol)
{
   fp2 = fopen("output.txt","w");
   while (p->next!=NULL)
   {
       fprintf(fp2,"%c",p->el);
       p = p->next;
   }
   fprintf(fp2,"%c",p->el);
}
void main ()
{
       elem * p;
       fp = fopen("input.txt","r");//открытие файла
       p = new elem;//память для первого элемента
       int kol = shet();//количество символов до точки
       vvod(kol, p); //ввод структуры
       p=del(p, kol);
         vyvod(p,kol);
}

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group