2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Работа над структурами (на С)
Сообщение22.02.2013, 14:45 


22/12/12
54
Задача: дана последовательность символов (символов 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 


22/12/12
54
Вот я еще для 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 


22/12/12
54
собственно вот...написал для нечетного кол-ва элементов.
Используется синтаксис 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 


22/12/12
54
В общем, спасибо, что не подсказали, теперь я сам разобрался:)
вот код собственно:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group