1

リンクされたリストにアイテムを挿入するのに問題があります。すべての要素は、最後に挿入された同じ *data コンテンツを持つことになります。プログラムは正常にコンパイルされます。私は gcc と gdb を使用しています。私はコーディングに慣れていないので、私のプログラミング スタイルに問題があれば指摘してください。

typedef struct Node{
    void* data;
    struct Node* next;
} *node;

node allocate(){
    node current = malloc(sizeof(struct Node));
    current->data = NULL;
    current->next = NULL;
    return current;
}


void insert(node *head, void *data){
    // if head has no data then set the data on head and return
    if(((*head)->data == NULL)&&((*head)->next == NULL)){
        (*head)->data = data;
        return;
    }

    node newHead = allocate();
    newHead->data = data;
    newHead->next = *head;
    *head = newHead;
    //printf("Node Data : %d\tNext Node Data : %d",
        //*(int *)((*head)->data), *(int *)((*head)->data));
}

int main(int argc, char *argv[]){
    node head = allocate();
    int count = inputSequence(&head);
    int *aod = calloc((size_t) count, sizeof(int));
    generateAOD(head, aod);
    if(checkJolly(aod, count) == TRUE)
        printf("Jolly\n");
    else
        printf("Not Jolly\n");

    return 0;
}

int inputSequence(node *input){
    int *num = malloc(sizeof(int));
    int count = 0;

    while((scanf("%d", num) != EOF)){
        insert(input, (void *)num);
        count++;
    }
    traverse(*input, fn);
    return count;
}
4

2 に答える 2

2

挿入ロジックが存在しません。そして、あなたが使用している方法でリンクされたリストを管理しようとすることで、あなたは文字通りあなたの人生をより困難にしています.

ヘッド ポインター自体は、リストが空かどうかを示す必要があります。NULL の場合は空です。そうでない場合は、データがあります。それに応じて挿入ロジックをコーディングします。

そして、あなたinputSequenceは完全に壊れています。1 つのデータ ポイントのみを割り当て、挿入ごとに同じデータ割り当てを使用します。挿入ごとに 1 つ必要です。

まず、allocate()挿入されるデータを受け入れるように変更します。残りのコードがすっきりします。

node allocate(void *data)
{
    node current = malloc(sizeof(*current));
    current->data = data;
    current->next = NULL;
    return current;
}

次に、必要に応じて新しいノードを割り当てて挿入します。

void insert(node *head, void *data)
{
    node p = allocate(data);
    p->next = *head;
    *head = p;
}

inputSequence()次に、各エントリにメモリを適切に割り当てるように修正します。

int inputSequence(node *input)
{
    int count = 0;
    int num = 0;

    // note: check for number of params *successfully* parsed.
    //  if it isn't 1, its time to leave the loop.
    while(scanf("%d", &num) == 1)
    {
        int *data = malloc(sizeof(num));
        *data = num;
        insert(input, data);
        ++count;
    }
    return count;
}

最後に、ヘッド ポインタが最初は NULL であることを確認してくださいmain()

int main(int argc, char *argv[])
{
    node head = NULL;

    // load linked list
    inputSequence(&head);

    // ... the rest of your code....;

    return 0;
}

上記の場合、「私のリストは空ですか」の論理的な答えは単純ですif (!head)。さらに、これにより、トラバーサルなどのことが簡単になります。

void traverse(node ptr, void (*pfn)(void *))
{
    while (ptr)
    {
        pfn(ptr->data);
        ptr = ptr->next;
    }
}

リストを解放することも同様に簡単です:

void destroy(node *head)
{
    while (*head)
    {
        node p = *head;
        *head = p->next;
        free(p->data);
        free(p);
    }
}
于 2013-09-19T08:55:05.547 に答える
1
   typedef struct Node{
         void* data; // Make it as int or any other data type
         struct Node* next;
   } *node;

関数 inputSequence() では、最初に num にメモリを割り当て、ノードを追加するたびに node->data がこのメモリを指すようにします。したがって、リンクされたリストの各ノードのデータ ポインターは同じメモリ位置を指しているため、同じ値が含まれています。

データを引き続き void ポインターとして使用する場合は、while ループの反復ごとに num を割り当て、これを挿入関数に渡します。

    while((scanf("%d", num) != EOF)){
        num = malloc(sizeof(int);
        insert(input, (void *)num);
        count++;
    }
于 2013-09-19T08:52:26.907 に答える