Умножение многочленов. Проблема такая: не могу задать степень второго многочлена и вообщем то реализовать сам алгоритм перемножения. Может кто-нибудь кинет идею.
"Разделяй и властвуй"... Не надо в одной структуре хранить данные обоих многочленов, если ты разделишь это на 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;
}
Объясните пожалуйста вот это:
#include <stdio.h>
// это процедура или как? чет не доходит
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;
// вот тут можно поподробнее, хотя вроде тож понимаю, но плохо
if(!first) first = p;
else last->ref = p;
last = p;
}
}
// это тоже не понятно : (
return first;
}
void print_list(struct list *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;
}
Комментарии добавлены выше...
void pr_list(struct list *p, struct list *p2)
{
while(p && p2) {
printf("(%d): %d\n", p->st, p->inf * p2->inf); /* в скобках - степень */
/* Ну, можешь добавить результат умножения в третий список */
p = p->ref; p2 = p2 -> ref;
}
}
Всё заработало. Спасибо. Только там еще надо дописать, если в одном многочлене больше коэфициентов чем в другом, прога не будет работать.
while(p && p2) ...
Погоди...
Нет, при умножении надо делать по другому... Там надо вложенный цикл... Сейчас покажу.
Вот, посмотри:
#include <stdio.h>
struct list
{
int inf; // коэфициенты
int st; // степени
struct list *ref;
};
/*
процедура добавляет элемент, если этой степени еще не было,
и суммирует коэффициенты, если степень уже есть в списке
*/
void append(struct list **first, struct list **last, int st, int inf)
{
struct list *pt, *p;
int found = 0;
for(pt = *first; (!found) && pt; pt = pt->ref) {
if(pt->st == st) {
pt->inf += inf;
found = 1;
}
}
if(!found) {
p = (struct list*)malloc(sizeof(struct list));
p->st = st; p->inf = inf; p->ref = NULL;
if(!(*first)) *first = p;
else (*last)->ref = p;
*last = p;
}
}
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;
if(!first) first = p;
else last->ref = p;
last = p;
}
}
return first;
}
void print_list(struct list *p)
{
for(; p; p = p->ref) {
printf("k = %d, st = %d\n", p->inf, p->st);
}
}
struct list *pr_list(struct list *p, struct list *p2)
{
struct list *first, *second;
struct list *begin = NULL, *end = NULL;
for(first = p; first; first = first->ref) { /* Теперь делаем умножение как положено */
for(second = p2; second; second = second->ref) {
printf("(%d): %d\n", (first->st + second->st), (first->inf * second->inf)); /* для контроля */
append(&begin, &end, (first->st + second->st), (first->inf * second->inf));
}
}
return begin;
}
int main()
{
FILE *fp,*fp2;
struct list *L1, *L2, *L3;
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);
L3 = pr_list(L1, L2);
print_list(L3);
return 0;
}