1

我试图破坏我的双端队列,但不知何故我失败了。我编写了以下代码(deque 是一个指向指针的指针,它指向 deque 的第一个元素)。DequeItem 是具有字段 next(指向下一个元素)和数据(void *)的结构。

void deque_destroy(DequeItem **deque) {
    DequeItem *temp;
    DequeItem *item;
    for (item = *deque; item != NULL; item = temp) {
        printf("%d", *((int*)((item)->data)));
        temp = item->next;
        free(item);
    }
}

结构声明是:

struct DequeItem {
  void *data;                  // Data stored in the deque item

  struct DequeItem *previous;  // Pointer to the previous DequeItem in the ring
  struct DequeItem *next;      // Pointer to the next DequeItem in the ring
};

typedef struct DequeItem DequeItem;
4

2 回答 2

3

看起来正确,在您调用该项目temp 之前阅读做得很好free(),这是您避免的常见初学者错误。

我认为您需要提供更多关于出了什么问题的信息,也许还需要提供结构声明。

成员是否data也动态分配内存?如果是这样,您可能还需要free(item->data);调用,具体取决于创建项目时它是如何分配的。

正如评论者所指出的,您的data指针可能是NULL这样,您应该在打印之前检查它:

if(item->data != NULL)
  printf("%d\n", *(int *) item->data);

笔记:

  • 转换表达式的简化使其更易于阅读。
  • 在字符串中包含换行符 ( '\n')printf()以避免缓冲混淆和直观地分隔值。
于 2012-04-25T07:25:52.880 回答
1

问题是,即使第一个元素已被破坏,双端队列中最后一个元素(后元素)的下一个指针将指向第一个元素(前元素)。我通过设置解决了这个问题

(*deque)->previous->next = NULL

在上面的for循环之前。感谢帮助!

于 2012-04-25T16:50:48.807 回答