0

私が書いているプログラムでは、リンクされたリストが必要なので、かなり具体的な実装です。が必要だ:

  1. 最後にノードを追加する機能
  2. データが指定された値と一致するノードを削除する機能

データは cstring で、長さは 20 文字以下です。私は C の経験があまりなく、次の署名でエラーが発生していますvoid addToEnd(llist root, char entery[51])。に置き換えllistてみましたnodeが、エラーは「不明な型名ノード」です。どうすればこれを取り除くことができますか?

これがコードです

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

typedef struct node
{
  char entery[51];
  struct node* next;
} llist;

/*may be losing root address permanently*/
void addToEnd(llist root, char entery[51])
{
    while(root->next != NULL)
        root = root->next;
    node last = malloc(sizeof(struct node));
    root->next = last;
    strcpy(last, entery);
}

int main()
{
    struct node *root = malloc(sizeof(struct node));
    root->next = NULL;
    strcpy(root->entery, "Hello");

    struct node *conductor = root;//points to a node while traversing the list

    if(conductor != 0)
        while(conductor->next != 0)
            conductor = conductor->next;

    /* Creates a node at the end of the list */
    conductor->next = malloc(sizeof(struct node));

    conductor = conductor->next;

    if (conductor == NULL)
    {
        printf( "Out of memory" );
        return EXIT_SUCCESS;
    }
    /* initialize the new memory */
    conductor->next = NULL;
    strcpy(conductor->entery, " world\n");

    addToEnd(root, " at the");
    addToEnd(root, " end");

    /*print everything in list*/
    conductor = root;
    if(conductor != NULL)
    {
        while(conductor->next != NULL)
        {
            printf("%s", conductor->entery);
            conductor = conductor->next;
        }
        printf("%s", conductor->entery);
    }

    return EXIT_SUCCESS;
}

私が不明なことの1つは、私が見たすべての例で、それらが struct を typedef していることです。なんで?詳しく説明させてください。または だけを渡したいかどうかはどうすればわかりますnodestruct node。また、私はその点を本当に理解していませんstruct node.1つのtypedefされた名前よりもそれほど長くはありません.

4

2 に答える 2

2

問題:

  1. 12行目:void addToEnd(llist root, char entery[51])とするvoid addToEnd(llist *root, char entery[51])。ここで root はポインタ型でなければなりません。そうしないと、実際には関数内でその値を変更して、関数の外で見えるようにすることはできません。

  2. 16行目:node last = malloc(sizeof(struct node));とするstruct node *last = malloc(sizeof(struct node));。C では、キーワードで型名を参照する必要がありstruct、また、それはポインターでなければならず、malloc で初期化することはできません。

あなたのtypedef質問に関しては、それはオプションであり、人々は便宜上のみ使用していると思います. 個人的に私はあまり頻繁に使用typedefしませんstruct

編集:

また、コードにはバグが伴います。申し訳ありませんが、以前は構文だけに焦点を当てていました。

mallocC では、割り当てられたメモリが zeored であることを保証しないことに注意してください。実際には内部の何かである可能性があります。したがって、手動で入力する必要があります:last->next = NULL;の最後に行を追加しaddToEndます。

于 2013-09-29T05:06:37.523 に答える
1

structリンクされたリストを参照するには、 を使用しstruct node、 の後にtypedefを使用することもできますllist。リンクされた質問が使用するように、ues することもできます。

typedef struct node
{
  char entery[51];
  struct node* next;
} node;

nodeこのスタイルでは、 と同じように使用できますstruct node

あなたが直面している構文エラーは、矢印演算子を誤用し->ことです。には、ドット演算子を使用しますstructstruct.

したがって、機能については

void addToEnd(llist root, char entery[51])
{
    while(root->next != NULL)
        root = root->next;

ポインターを渡す必要があります。

void addToEnd(llist* root, char entery[51])
于 2013-09-29T05:08:32.687 に答える