2014-11-04 3 views
-4

Итак, это фрагмент, в котором добавление происходит после взятия двух полиномов. Последняя часть его, где я пытаюсь отобразить сумму, - это то, где я застреваю. то, что я не получаю, - это почему не должен работать цикл while. может кто-нибудь помочь ?! PS: Функции - это то, что я не мог использовать здесь. Некоторые другие ограничения из-за требований вопроса. PPS: Также я знаю, что вы можете подумать, что это очень простая программа, и поверьте мне, когда я говорю, что я знаю, что это так .. но мне действительно нужна помощь, освещая эти базовые навыки, и любая помощь вообще будет оценена по достоинству.Почему не добавляется это многочленное дополнение?

struct poly 
{ int e;float c; 
    struct poly *next; 
}; 
typedef struct poly node; 

r = (node*)malloc(sizeof(node)); //r is a node of structure 
p3 = r; 
if((p3 == NULL) || (r == NULL)) { printf("insuf mem");return;} 

while ((p1!=NULL) && (p2!=NULL)) { 
if(p1->e == p2->e) { 
r->e = p1->e; 
r->c = (p1->c) + (p2->c); 
p1 = p1->next; 
p2 = p2->next; 
r->next = (node*)malloc(sizeof(node)); 
r = r->next; 
} 
else if ((p1->e) > (p2->e)) { 
r->e = p1->e; 
r->c = p1->c; 
p1 = p1->next; 
r->next = (node*)malloc(sizeof(node)); 
r = r->next; 
} 
else { 
r->e = p2->e; 
r->c = p2->c; 
p2 = p2->next; 
r->next = (node*)malloc(sizeof(node)); 
r = r->next; 
} 
/* if((p1 == NULL)&&(p2==NULL)) 
r->next=NULL; 
else 
r = r->next;*/ 
} 

while (p1!=NULL) 
{ 
r->e = p1->e; 
r->c = p1->c; 
p1 = p1->next; 
r->next = (node*)malloc(sizeof(node)); 
r = r->next; 
/*if(p1!=NULL) 
    r = r->next; 
else r->next=NULL;*/ 
} 

while (p2!=NULL) 
{ 
r->e = p2->e; 
r->c = p2->c; 
p2 = p2->next; 
r->next = (node*)malloc(sizeof(node)); 
r = r->next; 
/* if(p2!=NULL) 
    r = r->next; 
else r->next=NULL;*/ 
} 
r=NULL; 


printf("\n\nThe sum is\n"); 
while(p3!=NULL) { 
printf("%3.2f X^%d + ",p3->c,p3->e); 
p3 = p3->next; 
} 

getch(); 
} 
+1

бесконечный цикл? Что gdb сказал об этом? BTW не бросает malloc() возвращаемое значение ... –

+1

Попробуйте добавить printf («p3 =% p \ n», p3) в начало вашего заключительного цикла. Он будет печатать значение указателя p3 на каждой итерации. Вероятно, вы увидите, что в связанном списке есть цикл, и поэтому он никогда не заканчивается. –

+0

Стена с кодом. Bleah. Тем не менее, 'free (r)' вызывает после циклов 'for' в' main() 'выглядит довольно подозрительно. –

ответ

0

Когда вы сделаете это:

r->next = malloc(sizeof(node)); 
r = r->next; 

спросить себя, что содержание r является:

r->e = ?; 
r->c = ?; 
r->next = ?; // Important! 

Ответ в том, что содержимое r неизвестна/не определено. Поскольку это будет последний узел в вашем связанном списке, начиная с p3, и очень маловероятно, что r->next будет NULL, у вас нет «конца» в вашем списке.

Чтобы это исправить, необходимо инициализировать содержимое всех новых узлов, таких как:

r->next = malloc(sizeof(node)); 
r = r->next; 

r->next = NULL; //Initialize new node at end of list 
r->c = 0; 
r->e = 0; 
Смежные вопросы