2015-06-15 3 views
1

Я кодирую программу для умножения двух полиномов. Мне нужен совет относительно того, как я могу перезапустить двойной связанный список во вложенном цикле в функции 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; 
+0

Если есть 'функция Dlast', возможно есть 'Dfirst' функция? – dreamlax

+0

Вы, кажется, не сохраняете экспоненты вместе с коэффициентами, поэтому я не совсем уверен, как вы представляете многочлены. Какой полином (связанный список) вы пытаетесь «перезапустить»? Кажется, у вас есть «первый», поэтому вы можете вернуться к началу второго многочлена на каждой итерации. Вам нужно отредактировать выходной список, как вы идете? Вам нужно сохранить вкладки в начале выходного полинома просто, чтобы вы могли его вернуть, и вы можете перезапустить его. Но вам нужно подумать о том, как получить результат вручную. (ax2 + bx + c). (dx2 + ex + f) = adx4 + (ae + bd) x3 + (fa + be + cd) x2 + (ce + bf) x + cf? –

+0

@JonathanLeffler В списках number1 и number2 содержатся коэффициенты и экспоненты один за другим. Моя идея - умножить коэффициент и добавить показатель каждого члена в списке number2 с первым членом списка number1 и после этого продолжить со следующего члена списка number1. Но у меня проблема, когда список number2 достигает его конца. Я думаю, что лучше попробовать разделить продукт и операции добавления. –

ответ

0

Один из способов идти в начале списка, чтобы манипулировать указатель, чтобы перейти к началу списка

void seekstart(DLNode* number) 
{ 
    while(number->prev != null) 
    { 
     number = number->prev; 
    } 
} 

Другой вариант используйте временные узлы для хранения стартового узла списка перед обработкой.

DLnode *temp_num1 = number1; 
DLnode *temp_num2 = number2; 
result=polyProduct(number1,number2); 

Или Вы сохраняете указатель на корень в структуре самого узла. Хотя это может и не быть эффективным решением. Это весьма полезно, если вам нужно получить доступ запуск списка довольно часто

// Декларация DLnode в DLList.h файл

typedef struct Dcontainer 
{ 
int value; 
struct Dcontainer *next; 
struct Dcontainer *prev; 
struct Dcontainer *root; //root is the starting of the list 
} DLnode; 
+0

Спасибо, что первая функция работает –

Смежные вопросы