Я кодирую программу для умножения двух полиномов. Мне нужен совет относительно того, как я могу перезапустить двойной связанный список во вложенном цикле в функции polyProduct. Я имею в виду, что в этот момент мне нужно вернуться к первой позиции списка. Это код, который я до сих пор:Как перезапустить двойной связанный список?
#include "DLListInterface.h"
#include <stdio.h>
#include <stdlib.h>
int numRead(DLnode*,int);
void printList(DLnode*);
DLnode *polyProduct(DLnode*,DLnode*);
int main()
{
DLnode *number1;
DLnode *number2;
DLnode *result;
int readval;
int numbterms;
int i;
scanf("%d",&numbterms);
scanf("%d",&readval);
/* initial DLnode of number1*/
number1=(DLnode*)malloc(sizeof(DLnode));
number1->value=readval;
number1->next=NULL;
number1->prev=NULL;
readval=numRead(number1,numbterms);
scanf("%d",&numbterms);
scanf("%d",&readval);
number2=(DLnode*)malloc(sizeof(DLnode));
number2->value=readval;
number2->next=NULL;
number2->prev=NULL;
readval=numRead(number2,numbterms);
printf("\n");
printList(number1);
printList(number2);
result=polyProduct(number1,number2);
printList(result);
getch();
return 0;
}
int numRead(DLnode*number,int numbterms)
{
int readval,i;
DLnode *anothernode;
for(i=0;i<(numbterms*2)-1;i++)
{
scanf("%d",&readval);
anothernode=(DLnode*)malloc(sizeof(DLnode));
anothernode->value=readval;
anothernode->next=NULL;
anothernode->prev=Dlast(number);
Dlast(number)->next=anothernode;
}
return readval;
}
DLnode *polyProduct(DLnode*poly1,DLnode*poly2)
{
DLnode *result;
DLnode *newnode;
DLnode *first;
first=poly2;
newnode=(DLnode*)malloc(sizeof(DLnode));
newnode->value=(poly1->value)*(poly2->value);
newnode->next=NULL;
newnode->prev=NULL;
result=newnode;
poly1=poly1->next;
poly2=poly2->next;
newnode=(DLnode*)malloc(sizeof(DLnode));
newnode->value=poly1->value+poly2->value;
newnode->next=NULL;
newnode->prev=Dlast(result);
Dlast(result)->next=newnode;
poly1=poly1->prev;
poly2=poly2->next;
while(poly1!=NULL)
{
while(poly2!=NULL)
{
newnode=(DLnode*)malloc(sizeof(DLnode));
newnode->value=(poly1->value)*(poly2->value);
newnode->next=NULL;
newnode->prev=Dlast(result);
Dlast(result)->next=newnode;
poly1=poly1->next;
poly2=poly2->next;
newnode=(DLnode*)malloc(sizeof(DLnode));
newnode->value=poly1->value+poly2->value;
newnode->next=NULL;
newnode->prev=Dlast(result);
Dlast(result)->next=newnode;
poly1=poly1->prev;
poly2=poly2->next;
}
poly1=poly1->next;
poly2=first; //restart poly 2
}
return result;
}
void printList(DLnode*number)
{
while (number!=NULL)
{
printf("%d ",number->value);
number=number->next;
}
printf("\n");
return;
}
//Declaration of DLnode in DLList.h file
typedef struct Dcontainer
{
int value;
struct Dcontainer *next;
struct Dcontainer *prev;
} DLnode;
Если есть 'функция Dlast', возможно есть 'Dfirst' функция? – dreamlax
Вы, кажется, не сохраняете экспоненты вместе с коэффициентами, поэтому я не совсем уверен, как вы представляете многочлены. Какой полином (связанный список) вы пытаетесь «перезапустить»? Кажется, у вас есть «первый», поэтому вы можете вернуться к началу второго многочлена на каждой итерации. Вам нужно отредактировать выходной список, как вы идете? Вам нужно сохранить вкладки в начале выходного полинома просто, чтобы вы могли его вернуть, и вы можете перезапустить его. Но вам нужно подумать о том, как получить результат вручную. (ax2 + bx + c). (dx2 + ex + f) = adx4 + (ae + bd) x3 + (fa + be + cd) x2 + (ce + bf) x + cf? –
@JonathanLeffler В списках number1 и number2 содержатся коэффициенты и экспоненты один за другим. Моя идея - умножить коэффициент и добавить показатель каждого члена в списке number2 с первым членом списка number1 и после этого продолжить со следующего члена списка number1. Но у меня проблема, когда список number2 достигает его конца. Я думаю, что лучше попробовать разделить продукт и операции добавления. –