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

您似乎没有取消引用 objPtr。这就是为什么你会得到很大的价值。

我假设 l_next 应该返回一个 node_type。在这种情况下,您需要:

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

要不更改 fprintf,请将 l_next 中的 object = 更改为:

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

此外,您可能应该知道 l_next 实际上不会迭代。它不会改变 iter 中位置的值。

于 2012-09-28T17:28:05.867 回答
0

您需要传入一个指向 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 回答
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 回答