リンクされたリストでは、一連のステートメントなどmalloc
を追加せずに余分なノードを作成しないようにしています。if
私は次のものを持っています:
polynomial create()
{
polynomial head = NULL;
polynomial temp = NULL;
int numTerms, coefficient, exponent;
int counter = 0;
printf("Enter the number of terms in the polynomial: ");
scanf ("%d", &numTerms);
printf("\n");
if (numTerms == 0) {
head = malloc(sizeof(term));
head->coef = 0; head->exp = 0; head->next = NULL;
return head;
}
while (numTerms != counter) {
// Ask for input
printf("Enter the coefficient and exponent of term %d: ", (counter + 1));
scanf("%d %d", &coefficient, &exponent);
printf("\n");
// Create the term
if (temp == NULL) temp = malloc(sizeof(term));
temp->coef = coefficient; temp->exp = exponent; temp->next = NULL;
//if((numTerms - 1) != counter) temp->next = malloc(sizeof(term)); -- this is my workaround
printf("Created: %d %d\n", temp->coef, temp->exp);
// If this is the first node created, mark the head
if (counter == 0) head = temp;
// Increment the list and counter
temp = temp->next;
counter ++;
}
return head;
}
しかし、多項式を印刷すると (そのために完全に機能する関数があります)、次のようになります。
Polynomial 1: 3x^4
--> この場合、head->next への参照は NULL です
そこで、次の回避策を試しました。新しいノードに事前にメモリを割り当てますが、これがユーザー入力の最後の反復になる場合に限ります。これは、次の方法で実現されます。
temp->next = NULL;
と置き換えます
if((numTerms - 1) != counter) temp->next = malloc(sizeof(term));
これnumTerms - 1
は「余分なノード」の追加を防ぎ、malloc は temp->next への参照を維持します。if
チェックを使用せず、常に余分なメモリを割り当てると、次のようになります。
Polynomial 1: 3x^4 - 7x^2 + 5 + 10621224x^10617028
temp->next への参照が失われる原因となる割り当てのどの部分が欠けていますか? 私は一般的にポインターとメモリ管理が本当にひどいので、これはおそらくひどい質問です。