-4

メインから別の場所で呼び出されるリンクされたリストを作成したいと考えています。この連結リストはノードで構成されています。

たとえば、これは私のコードではなく、単純化されたバージョンです。

nodeTest.h

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

struct nodeTest
{
    int data;
    struct nodeTest* next;
};

次に、その構造体を使用しようとする別のファイルがあります。

nodeTest.c

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

 int main(void) {
     struct nodeTest* first = malloc(sizeof(struct nodeTest));
     first->data = 0;
     return 0;
 }

void addLL(int data){
    if (first.data = 0)
    {
        printf("No head\n");
    }
}

最初にリンクされたリストの最初の要素になりたいのですが、最初に使用する addElement を定義するにはどうすればよいですか? 今、最初に電話すると、認識できないエラーが発生します。

メインの後にリンクリストファイル内でエラーが発生する場所は次のとおりです

void addLL(int data){
    if (head.data = 0)

if 行でエラーが発生します。ヘッドが認識されません。

4

3 に答える 3

1

問題 0: 連結リストと C の理解

その上にたくさんの資料があります。たとえば、データ構造に関する講義のスライドをご覧ください。

問題 1: 'head undeclared'

変数を使用する前に、まず導入する必要があります。この問題headは、(C の規則に従って) 関数の範囲内にないことが原因で発生します。そのため、ポインタを引数として渡す必要があります。

void addLL(struct nodeTest *head, int data){
  // now you can access head->data, head->next
  // .. 
}

利用可能なデータがないことを示すために使用する場合0、ゼロを保存することはできません。もう 1 つの方法は、リスト要素の数を保持し、その数がゼロかどうかをチェックして、リストが空かどうかを判断することです。

問題 2: 'first->data' が宣言されていない

最初に宣言するか ( と同じhead)、または を使用しますhead->data

問題 3: リストの設計と API

グローバルな状態を使用することは一般に悪い習慣であることが認められているため、グローバル リストは使用しないでください。list_add()リストに別の構造体を定義し、 orのような他の関数の周りにポイントを渡すことをお勧めしますlist_remove()。これにより、最後の要素へのポインターを保存して、O(1) 操作を追加することもできます。

struct list {
  struct node *first;
  struct node *last;
  unsigned long length;
};

したがって、リストが空かどうかを確認する関数を実装できます。

inline bool list_is_empty(struct list* l) {
  assert(l != NULL);
  return l->length;  
}

で複数のリストを使用しますmain

 struct list *list1 = list_create(); // sets length to 0
 struct list *list2 = list_create(); // return a new list
 //...
 list_add(&list1, data); // you pass a pointer to the list to which you want to add
 //...
 struct node *e = list_search(&list1, data);
 if (e == NULL)
   printf("not found\n");
 //...
 list_remove(&list1, data);
 //
 list_destroy(&list1); 

リストへの要素の追加は、次のように実装できます。

int list_add(struct list* l, int data) {

    if (l == NULL)
        return LIST_FAILURE; // or exit with an error message

    l->last->next = list_elem_create(data); // dynamically creates a new node
    l->last = l->last->next;
    l->length++;
    return LIST_SuCCESS; // symbolc constant defined elsewhere 
}
于 2013-10-05T20:36:22.380 に答える
0

メイン関数を呼び出す前にメモリを割り当てることはできません。メインの外でグローバル変数を宣言し、そのアドレスを最初に使用することができます。メイン内の割り当ては機能するはずであり、それが最善の方法です。ただし、構造体を使用できるようにするには、以下のような構造体を型キャストする必要があります。そうしないと、コンパイルが失敗します

typedef struct First {

<element 1>
struct first *next

} First;

その後、これを行うことができます

First *first = NULL
first = (First *) malloc(sizeof(First));
于 2013-10-05T20:29:26.140 に答える