2016-10-05 3 views
1

При печати полинома первый коэффициент и показатель неоднократно печатаются для n (не членов) раз.Полином в круговом связанном списке

Input: 
    No of terms: 3 
    Enter coefficient and exponent: 3 3 
    Enter coefficient and exponent: 2 2 
    Enter coefficient and exponent: 1 1 

Output: 
3x^(3) + 3x^(3) + 3x^(3) 

Это код:

#include<stdio.h> 
#include<stdlib.h> 

struct Node{ 
    int coef , exp; 
    struct Node* next; 
}; 

struct Node* create(struct Node*); 

int main(){ 

    int val , choice , loc; 
    struct Node* A = NULL; 
    struct Node* B = NULL; 

    A = create(A); 
    B = create(B); 
    display(A); 
    display(B); 

    do{ 
     printf("\n\n-----POLYNOMIAL OPERATIONS-----\n1.Addition\n2.Multiply\n3.Evaluate\n4.Exit\n--->"); 
     scanf("%d",&choice); 

     switch(choice){ 
      case 1://Adding 
        break; 
      case 2://Multiplying 
        break; 
      case 3://Evaluating 
        break; 
     } 

    }while(choice != 4); 


    return 0; 
} 

struct Node* create(struct Node* p){ 

    int i , c , x , t; 
    printf("\nNumber of terms: "); 
    scanf("%d",&t); 
    for(i = 0 ; i < t ; i++){ 
     struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); 
     printf("Enter Coefficient & Exponent: "); 
     scanf("%d%d",&c,&x); 
     temp->coef = c; 
     temp->exp = x; 
     if(p == NULL){ 
      p = temp; 
      temp->next = p; 
     }else{ 
      struct Node* temp1 = p; 
      while(temp1->next != p) temp1 = temp1->next; 
      temp1->next = temp; 
      temp->next = p; 
     } 
    } 
    return p; 
} 

void display(struct Node* p){ 

    struct Node* temp = p; 
    printf("\nPOLYNOMIAL: "); 

    do{ 
     printf("%dx^(%d)",p->coef,p->exp); 
     temp = temp->next; 
     if(temp != p){ 
      printf(" + "); 
     } 
    }while(temp != p); 
} 
+0

В функции 'create' вы связываете поле' .next' 'temp' с' temp' (потому что вы выполняете 'p = temp; temp-> next = p;'). –

+0

Почему вы используете круговой список? Почему не обычный (некруглый) список? Я не вижу очевидной выгоды. –

ответ

2

Вам просто нужно изменить:

do{ 
     printf("%dx^(%d)",temp->coef,temp->exp); 
     temp = temp->next; 
     ... 

Прямо сейчас вы разыменования начальный узел каждый раз, когда вы идете через петлю дисплея!

Я хочу отметить, что, поскольку функция display() написана прямо сейчас, у вас будет segfault, если указатель NULL когда-либо передается ему. Точно это произойдет, если вы введете 0 в любом из приглашений для Number of terms:.

+0

Спасибо .... теперь его рабочий штраф –

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