IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Динамические структуры данных. Язык Си., Списки.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Никита

Репутация: -  0  +


Умножение многочленов. Проблема такая: не могу задать степень второго многочлена и вообщем то реализовать сам алгоритм перемножения. Может кто-нибудь кинет идею.

Код


#include "stdafx.h"
#include <stdio.h>
struct list
{
    int inf1,inf2; // коэфициенты
    int st1,st2; // степени
    struct list *ref1,*ref2;
};
main()
{
    FILE *fp,*fp2;
    struct list *p1,*p2,*beg1 = NULL,*beg2 = NULL,*end1 = NULL,*end2 = NULL;
    fp = fopen ("spisok.txt","r");
    fp2= fopen ("spisok2.txt","r");
    printf("MNOGOCHLENI\n");
    int i,k;
    i = -1; // степень первого многочлена
    k = -1; //степень второго многочлена
    while ( !feof(fp) && !feof(fp2) )
    {
        p1 = p2 = (struct list*)malloc(sizeof(struct list));
        fscanf (fp,"%d",&p1->inf1);
        fscanf (fp2,"%d",&p2->inf2);
        i++; //увеличиваем степень первого многочлена, степени идут с головы списка
        if (feof(fp) && feof(fp2))
        {
            free(p1);
            free(p2);
            break;
        }
        end1 = p1; end2 = p2;
        end1->ref1 = end2->ref2 = NULL;
        while (p1!=NULL) // вывод на экран первого списка
        {
            p1->st1 = i;
            printf("k = %d, st = %d\n",p1->inf1,p1->st1);
            p1=p1->ref1;

        }
        while (p2!=NULL) // вывод на экран второго списка
        {
            printf("k2 = %d\n",p2->inf2);
            p2=p2->ref2;

        }
    }
}


Вот набрасал алгоритм:
1) Начинаем обходить 1ый список
2) Считываем степень
3) Перемножаем элементы 1-го списка с элем. 2-го списка, если степени равны
4) Если степени не равны, то (?????????) - тута че-то не доходит
5) Результат записываем в третий список.

Сообщение отредактировано: Bo2nik -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






"Разделяй и властвуй"... Не надо в одной структуре хранить данные обоих многочленов, если ты разделишь это на 2 структуры, будет гораздо проще:

#include <stdio.h>
struct list
{
int inf; // коэфициенты
int st; // степени
struct list *ref;
};

/* Функция, возвращающая указатель на начало созданного списка */
struct list *get_list(FILE *fp)
{
struct list *last = NULL, *first = NULL, *p;
int value, i = -1;

while(!feof(fp)) {
p = (struct list*)malloc(sizeof(struct list));
fscanf(fp, "%d", &value);
if(!feof(fp)) {
p->inf = value;
p->st = ++i;
p->ref = NULL;

/*
если first == 0, то есть пока список пуст, то считаем
началом только что выделенный элемент, иначе то что раньше было
"хвостом" должно указывать на новый элемент
*/
if(!first) first = p;
else last->ref = p;

last = p; /* В любом случае новый элемент становится "хвостом" */
}
}
return first; /* Что ж здесь непонятного? Вернуть начало списка... */
}

void print_list(struct list *p)
{
/*
мне не надо инициализировать p в начале цикла, начинаем работать
непосредственно с тем, что передали в функцию как параметр, поэтому
оставляем первую часть пустой
*/
for(; p; p = p->ref) {
printf("k = %d, st = %d\n", p->inf, p->st);
}
}

int main()
{
FILE *fp,*fp2;
struct list *L1, *L2; // , *p;

fp = fopen ("spisok.txt","r");
fp2= fopen ("spisok2.txt","r");

printf("first poly:\n");
L1 = get_list(fp);
print_list(L1);

printf("second poly:\n");
L2 = get_list(fp2);
print_list(L2);

return 0;
}


А теперь - просто пройди по двум спискам, и перемножь их (причем, если один из списков кончился, то перемножение можно тоже завершить)...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 3.05.2024 6:24
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name