2016-09-26 5 views
1

お願いします。以下のコードは、多項式関数を表現するために作られ、その多項式をソートされます。リンクリストを使用して多項式を表現しソートするIN C

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

typedef struct PolyNode *pnode; 
typedef struct PolyNode { 
    float coef; 
    int expon; 
    pnode next; 
}; 

pnode Make_Node(pnode ptr, float coef, int expon) { 
    ptr->coef = coef; 
    ptr->expon = expon; 
    ptr->next = NULL; 
    return ptr; 
} 

pnode Input_Node(pnode ptr, float coef, int expon) { 
    if (ptr->expon < expon || ptr) { 
     pnode temp = NULL; 
     temp = malloc(sizeof(pnode)); 
     temp = Make_Node(temp, coef, expon); 
     temp->next = ptr; 
     ptr = temp; 
     return ptr; 
    } else { 
     pnode temp = NULL; 
     temp = malloc(sizeof(pnode)); 
     temp = Make_Node(temp, coef, expon); 
     pnode pol; 
     pol = ptr; 
     while (pol->next && pol->next->expon > expon) { 
      pol = pol->next; 
     } 
     temp->next = pol->next; 
     pol->next = temp; 
     return ptr; 
    } 
} 

void Print_Pol(pnode ptr) { 
    pnode temp; 
    temp = ptr; 
    while (temp) { 
     printf("%gx^%d", temp->coef, temp->expon); 
     if (temp->next != NULL) { 
      printf(" + "); 
     } 
     temp = temp->next; 
    } 
} 

int main() { 
    pnode ptr; 
    ptr = (pnode)malloc(sizeof(pnode)); 
    ptr = Make_Node(ptr, 2, 3); 
    ptr->next = NULL; 
    ptr = Input_Node(ptr, 2, 4); 
    printf("%s%d\n", &ptr, ptr->expon); 
    ptr = Input_Node(ptr, 3, 6); 
    printf("%s%d\n", &ptr, ptr->expon); 
    // ptr = Input_Node(ptr, 3, 7); 

    Print_Pol(ptr); 
    return 0; 
} 

は私を助けて! // ptr = Input_Node(ptr、3,7)の前に "//"を消去したとき。プログラムは実行されません。

+2

typedefの後ろにポインタの本質を隠してはいけません!あなたを含む誰もが混乱します。 –

+0

このコメントが表示されても実行されません – CIsForCookies

+0

エラー出力を質問にテキストとして入力することをおすすめします。時間が経ってもイメージリンクは引き続き機能するという保証はありません。 – Jacob

答えて

2

問題は、ノードごとに十分なスペースを割り当てていないように見えます。このコードを考える:

pnode ptr; 
ptr = (pnode) malloc(sizeof(pnode)); 

タイプpnodeポインタタイプですので、あなたはポインタのための十分なスペースを割り当てています。あなたが必要とするのは、struct PolyNodeのための十分なスペースです。これは、複数のメンバーの1つが含まれているため、必ずpnodeより大きくなります。

ptr = malloc(sizeof(*ptr)); 

キーポイントではなく、明示的なタイプの観点より、割り当てるスペースの量は、所望の結果のreferrentの大きさの観点から定義されていることである:私は、この形態の割り当てを書き込むお勧めします。これは間違ったタイプを指定することからあなたを守り、ポインターが指すタイプを変更した場合でも変更する必要はありません。

二次的には、Cでは戻り値をmalloc()にキャストする必要はありませんが(C++で行っていますが)、そうしないでください。

あなたが提示したコードのいくつかの箇所で割り当てに誤りがあることに注意してください。それらのすべてを修正するようにしてください。

0

malloc(sizeof(nodep))で十分なメモリを割り当てていません。sizeof(nodep)は、構造体のサイズではなく、ポインタのサイズです。代わりにmalloc(sizeof(struct PolyNode))を使用する必要があります。

Input_Node()にメモリを割り当てることによって、あなたのコードを簡素化を検討:

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

typedef struct PolyNode *pnode; 
struct PolyNode { 
    float coef; 
    int expon; 
    pnode next; 
}; 

pnode Input_Node(pnode ptr, float coef, int expon) { 
    pnode temp = malloc(sizeof(*ptr)); 
    if (temp == NULL) 
     return NULL; 
    temp->coef = coef; 
    temp->expon = expon; 
    temp->next = NULL; 

    if (ptr == NULL || ptr->expon < expon) { 
     temp->next = ptr; 
     ptr = temp; 
    } else { 
     pnode pol = ptr; 
     while (pol->next && pol->next->expon > expon) { 
      pol = pol->next; 
     } 
     temp->next = pol->next; 
     pol->next = temp; 
    } 
    return ptr; 
} 

void Print_Pol(pnode ptr) { 
    pnode temp = ptr; 
    while (temp) { 
     printf("%gx^%d", temp->coef, temp->expon); 
     if (temp->next != NULL) { 
      printf(" + "); 
     } 
     temp = temp->next; 
    } 
    printf("\n"); 
} 

int main(void) { 
    pnode ptr = Input_Node(NULL, 2, 3); 
    ptr = Input_Node(ptr, 2, 4); 
    ptr = Input_Node(ptr, 3, 6); 
    ptr = Input_Node(ptr, 3, 7); 
    Print_Pol(ptr); 
    return 0; 
} 
関連する問題