【发布时间】:2016-10-09 18:41:20
【问题描述】:
我正在尝试在 C 中设置一个双端指针队列。 到目前为止,我已经完成了推送功能的工作和测试。我的问题似乎是在两端弹出条目。
#include <stdlib.h>
#include <stdio.h>
#include "dequeue.h"
dequeue* dequeue_create()
{
return NULL;
}
void dequeue_push_front(dequeue** dq, int data)
{
dequeue* tmp = malloc(sizeof(*tmp));
tmp->data = data;
tmp->next=NULL;
if((*dq) == NULL)
{
(*dq) = tmp;
}
else
{
if ((*dq)->next == NULL)
{
(*dq)->next = tmp;
tmp->prev = (*dq);
}
else
{
dequeue* tmp_it = malloc(sizeof(struct _dequeue_));
tmp_it = (*dq)->next;
while(tmp_it->next != NULL)
{
tmp_it = tmp_it->next;
}
tmp_it->next = tmp;
tmp->prev = tmp_it;
}
}
}
void dequeue_push_back(dequeue** dq, int data)
{
dequeue* tmp = malloc(sizeof(struct _dequeue_));
tmp->data = data;
tmp->prev=NULL;
if((*dq) == NULL)
{
(*dq) = tmp;
}
else
{
if ((*dq)->prev == NULL)
{
(*dq)->prev = tmp;
tmp->next = (*dq);
}
else
{
dequeue* tmp_it = malloc(sizeof(struct _dequeue_));
tmp_it = (*dq)->prev;
while(tmp_it->prev != NULL)
{
tmp_it = tmp_it->prev;
}
tmp_it->prev = tmp;
tmp->next = tmp_it;
}
}
}
int dequeue_pop_front(dequeue** dq)
{
dequeue* tmp_get = malloc(sizeof(struct _dequeue_));
int output = 0;
if((*dq)->next == NULL)
{
printf("\ndqnext==null\n");
}
else
{
tmp_get = (*dq);
while(tmp_get->next != NULL)
{
tmp_get= tmp_get->next;
output = tmp_get->data;
}
tmp_get=tmp_get->prev;
free(tmp_get->next);
tmp_get->next=NULL;
}
return output;
}
int dequeue_pop_back(dequeue** dq)
{
dequeue* tmp_get = malloc(sizeof(struct _dequeue_));
int output = 0;
if((*dq)->prev == NULL)
{
printf("\ndqprev==null\n");
}
else
{
tmp_get = (*dq);
while(tmp_get->prev != NULL)
{
output = tmp_get->data;
tmp_get= tmp_get->prev;
}
free(tmp_get);
tmp_get=NULL;
}
return output;
}
dequeue.h:
#ifndef dequeue_H
#define dequeue_H
struct _dequeue_ {
struct _dequeue_* next;
struct _dequeue_* prev;
int data;
};
typedef struct _dequeue_ dequeue;
dequeue* dequeue_create();
void dequeue_destroy(dequeue** queue);
int dequeue_pop_front(dequeue** dq);
void dequeue_push_front(dequeue** dq, int data);
int dequeue_pop_back(dequeue** dq);
void dequeue_push_back(dequeue** dq, int data);
#endif /* dequeue_H */
main.c:
int main()
{
dequeue* dq = dequeue_create();
dequeue_push_front(&dq, 1);
dequeue_push_back(&dq, 2);
dequeue_push_front(&dq, 3);
for (int cnt = 1; cnt <=4; cnt++)
{
printf("FINAL=%d ", dequeue_pop_front(&dq));
}
//TODO : dequeue_destroy(&dq);
return 0;
}
我对指针很陌生,这似乎是我的问题。
我在弹出函数中尝试做的是遍历指针以到达最后一个并释放最后一个指针。但似乎它没有释放指针。现在尝试了几种不同的方法,但似乎都不起作用,难道是我设置推送功能的方式无法释放指针?
非常感谢任何帮助。 干杯
【问题讨论】:
-
我不明白你为什么在 pop 中调用
malloc()。这会导致代码中的内存泄漏。 -
我考虑过使用 tmp_get 作为 tmp 指针。将此修复为 dequeue* tmp_get = (*dq);并在 elses 中将其删除。