2015-06-15 74 views
1

我正在編寫一個程序來乘以兩個多項式。我需要一些建議,告訴我如何在polyProduct函數的嵌套while循環中重新啓動雙鏈表。我的意思是,在這一點上,我需要回到列表的第一位。這是我的代碼至今:如何重新啓動雙鏈表?

要去名單開始
#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

感謝第一個功能的作品 –