2016-06-02 5 views
0

リンクリストを使用して誰かがボイドポインタを理解するのを手伝ってもらえますか?リンクリストをより一般的にする

私が持っている:だけint型で動作します

struct listNode 
{ 
    int nodeValue; 
    struct listNode * next; 
}; 

typedef struct listNode listNode; 

。 int nodeValueをvoid * nodeValueに変更すると、代わりにvoidポインターを使用してリンクリストに値を送信しますか?例えば

、私はフロント機能に追加しました:

void addFront(listNode *L, int number); 

listNodeと数をとります。

それがvoid *ポインタだった場合、私はちょうどに署名を変更します

createListは次のように定義されて
int main(void) 
{ 
    listNode *list; 
    list = createList(); 

    for (int x = 0;x < 8;x++) 
    { 
     addFront(list,x); 

    } 

    return(0); 
} 

:私はのようなものを持っているint型を使用して私の主な機能で

void addFront(listNode *L, void* value); 

listNode *createList() 
{ 
    listNode *anyNode; 
    anyNode = malloc(sizeof(listNode)); 
    anyNode->next = NULL; 
    return anyNode; 
} 

listNode *initNode(int number) 
{ 
    listNode *newNode; 
    newNode = malloc(sizeof(listNode)); 
    newNode->nodeValue = number; 
    newNode->next = NULL; 
    return(newNode); 
} 

リストをより汎用的にするには、どのようにして整数を渡すことができますか?整数を宣言します。

答えて

1

残念ながら、一般的な行動のこの種は、大規模なオーバーヘッドの代償:あなたは動的intを割り当てることによって、その範囲を拡張する必要があります。リストにintを節約するために:

listNode *initNode(int number) 
{ 
    listNode *newNode; 
    newNode = malloc(sizeof(listNode)); 
    newNode->nodeValue = malloc(sizeof(int)); 
    *(newNode->nodeValue) = number; 
    newNode->next = NULL; 
    return(newNode); 
} 

この増加malloc(sizeof(int));は、通常、少なくとも16バイトのブロックを割り当てます。

-1

代替ソリューションは、listNode宣言に0サイズの配列を使用しています。例えば :のnodeValue用メモリ一つのcalloc()呼び出しでlistNodeブロックに割り当てるため

#include <stdlib.h> 
#include <string.h> 

struct listNode 
{ 
    struct listNode *next; 
    int nodeValue[0]; 
}; 

struct listNode *addFront(struct listNode **head, void *data, size_t size) 
{ 
    struct listNode *new_node = calloc(sizeof(struct listNode) + size, 1); 
    if(!new_node) 
    return NULL; 
    new_node->next = *head; 
    *head = new_node->next; 
    memcpy(new_node->nodeValue, data, size); 
} 

void addInt2Front(struct listNode **head, int value) 
{ 
    addFront(head, &value, sizeof(value)); 
} 

int main(void) 
{ 
    struct listNode *head = NULL; 
    addInt2Front(&head, 5); 
} 

それはは、二つの割り当てからのオーバーヘッドを減少させます。

+0

申し訳ありませんが、私のaddFrontはnew_nodeを返します。 コードに忘れてしまいました。 –

0

intまたはポインタを格納する方法の1つは、nodeValueを共用体型にすることです。未定義の動作を避けるには、呼び出しコードの整合性が必要です(つまり、リンクされたリストにintを追加する場合は、ポインターとして後でそれらにアクセスしないでください)。

union intOrPointer 
{ 
    int intValue; 
    void * pointerValue; 
}; 

struct listNode 
{ 
    union intOrPointer nodeValue; 
    struct listNode * next; 
}; 

typedef struct listNode listNode; 

listNode *initNode(int number) 
{ 
    listNode *newNode; 
    newNode = malloc(sizeof(listNode)); 
    newNode->nodeValue.intValue = number; 
    newNode->next = NULL; 
    return(newNode); 
} 
関連する問題