0

私は他の質問に目を通しましたが、どれも私の質問に答えませんでした。クラス割り当ての末尾から追加する単一リンクリストを設定しようとしています。

/** List node  **/
typedef struct node_type
{
   struct node_type *next;           /* Pointer to next node               */   
   void *objPtr;                     /* Pointer to associated object       */
} node_t;

/** List structure **/
typedef struct list_type
{
   node_t *head;                     /* Pointer to front of list           */
   node_t *tail;                     /* Pointer to end of list             */
} list_t;

list_t *newList() {
   list_t *list;
   list = (list_t *)malloc(sizeof(list_t));

   list -> head = NULL;
   list -> tail = NULL;
   return(list);
}

これらは私が使用するために与えられた構造でした。追加するための私の関数は次のようになります:

/** l_add -- add an object to the linked list **/
void l_add(list_t *list, void *objPtr) {
   node_t *newNode;
   newNode = (node_t *)malloc(sizeof(node_t));

   newNode -> objPtr = objPtr;
   newNode -> next = NULL;

   if ((list -> head == NULL) && (list -> tail == NULL)) {
   list -> head = newNode;
   list -> tail = newNode;
   } else {
   list -> tail -> next = newNode;
   list -> tail = newNode;

}
}

私のイテレータ関連の関数は次のようなものです。

iterator_t *newIterator(list_t *list) {

   iterator_t *itr;
   itr = (iterator_t *)malloc(sizeof(iterator_t));

   itr -> list = list;                    
   itr -> position = list -> head;

   return(itr); 
}

void *l_next(iterator_t *iter) {
  void *object;

   if ((iter -> position) == NULL) {
      return NULL;
      exit(0);
   } else {
      object = iter -> position -> next;
      iter -> position = iter -> position -> next;
}
  return  object; 

}

void l_begin(iterator_t *iter) {
    iter -> position = iter -> list -> head;
}

コンパイルしてもエラーは発生しません。受信するはずのデータではなく、メモリであると想定している大きな値が表示されます。私が渡す最初の値は「5」で、リストの最初の数値は変動しますが、数百万単位です。私はまだポインタに慣れようとしていますが、値ではなくアドレスを追加する理由を誰かが知っていますか?

私がそれを使用するコード:

   size = sizeof(data)/sizeof(int);
   for(index = 0; index < size; index++) {
      l_add(list1, &data[index]);
   }

   l_begin(iter1);
   ptr1 = l_next(iter1);
   fprintf(stdout, "First value=%d\n", *ptr1);

そしてlist1は:

int data[] = {5, 10, 15, 20, 25};
list_t *list1;
list1 = newList();

*印刷機能と私のイテレータを含むように更新されました。問題があるとは思いませんでしたが、あるかもしれません。長い質問で申し訳ありませんが、コードがあまりないように編集しようとしました。すべてが理にかなっていて、表示しようとしているものを台無しにしないことを願っています。

皆さん、ほぼ同時にそれを手に入れました、助けてくれてありがとう!

4

3 に答える 3

0

あなたl_nextは壊れています。nextオブジェクトの代わりにノードを返します。そのはず:

void *l_next(iterator_t *iter) {
  void *object;

   if ((iter -> position) == NULL) {
      return NULL;
      exit(0);
   } else {
      object = iter -> position -> objPtr;
      iter -> position = iter -> position -> next;
}
  return  object; 

}
于 2012-09-28T17:45:25.690 に答える
0

objPtrを間接参照していないように見えます。それがあなたが大きな価値を得ている理由です。

l_nextはnode_typeを返すことになっていると思います。その場合、次のものが必要になります。

fprintf(stdout, "First value=%d\n", *((int*)ptr1->objPtr));

fprintfを変更しない場合は、オブジェクト=inl_nextを次のように変更します。

object = iter -> position -> next -> objPtr;

また、l_nextは実際には繰り返されないことを知っておく必要があります。iterのpositionの値は変更されません。

于 2012-09-28T17:28:05.867 に答える
0

5の値へのポインタを渡す必要があります。したがって、5に設定された整数セットにメモリを割り当てる際に「5」を渡す代わりに、メモリ割り当て用のポインタを次のように渡します。

int * newObject = (int *)malloc(sizeof(int));

*newObject = 5;

l_add(list, newObject);

それを取得するには、で5の値をインスタンス化したタイプとしてオブジェクトを逆参照する必要があります。

さて、コードの残りの部分を投稿したので、イテレータが実際のオブジェクトではなくオブジェクトを返したので、次のノード構造を取得しているように見えます。

object = iter -> position -> next;

次のようになります。

object = iter -> position -> objPtr;
于 2012-09-28T17:29:12.253 に答える