大家看上小弟我这个队列有什么有关问题

大家看下我这个队列有什么问题

在遍历队的时候出现死循环的状况,不知道是什么原因

#include<stdio.h>
#include<stdlib.h>
struct node{
struct node *prev;
struct node *next;
int data;
};
int n = 0;
struct queue{
struct node *head_node;
struct node *tail_node;
};

struct queue *create(void) //创建队
{
struct queue *queue = (struct queue *)malloc(sizeof(struct queue));
struct node *head_node = (struct node *)malloc(sizeof(struct node));
queue->head_node =NULL;
head_node->next = head_node;
head_node->prev = head_node;
queue->head_node = head_node;
queue->tail_node = head_node;
queue->head_node->prev = NULL;
queue->tail_node->next = NULL;
return queue;
}
void in_queue(struct queue *queue,int data) //入队
{
struct node *cur_node = (struct node *)malloc(sizeof(struct node));

n++;
cur_node->data = data;
if(n == 1)
{
cur_node->prev = queue->head_node->prev;
cur_node->next = queue->tail_node->next;
queue->head_node->next = cur_node;
queue->tail_node->prev = cur_node;
}
else
{
/*cur_node->prev = queue->head_node->prev;
cur_node->next = queue->head_node;
node->prev->next = node;
node->next->prev = node;*/
cur_node->prev = queue->tail_node->prev;
cur_node->next = queue->tail_node;
cur_node->prev->next = cur_node;
cur_node->next->prev =cur_node;
/*queue->tail_node->prev->next = cur_node;
queue->tail_node->prev = cur_node;*/
}
}
void list_queue(struct queue *queue) //遍历队  
{
struct node *cur = (struct node *)malloc(sizeof(struct node));

for(cur = queue->head_node->next;cur->next != NULL;cur = cur->next)
printf("%d\n",cur->data);
}
void main()
{ int data;
struct queue *queue = (struct queue *)malloc(sizeof(struct queue));
queue = create();
while(1)
{
scanf("%d",&data);
if(data == 0)
break;
else
in_queue(queue,data);
}
list_queue(queue);
}

------解决方案--------------------
C/C++ code
#include<stdio.h>
#include<stdlib.h>

struct node{
    struct node *prev;
    struct node *next;
    int data;
};

int n = 0;

struct queue{
    struct node *head_node;
    struct node *tail_node;
};

struct queue *create(void) //创建队
{
    struct queue *queue = (struct queue *)malloc(sizeof(struct queue));
    struct node *head_node = (struct node *)malloc(sizeof(struct node));

    queue->head_node = head_node;
    queue->tail_node = head_node;
    queue->head_node->prev = NULL;
    queue->tail_node->next = NULL;

    return queue;
}

void in_queue(struct queue *queue, int data) //入队
{
    struct node *cur_node = (struct node *)malloc(sizeof(struct node));
    
    n++;

    cur_node->data = data;
                            
    queue->tail_node->next = cur_node;        
    cur_node->prev = queue->tail_node;
    queue->tail_node = cur_node;
    cur_node->next = NULL;

}

void list_queue(struct queue *queue) //遍历队  
{
    struct node *cur = (struct node *)malloc(sizeof(struct node));
    
    for(cur = queue->head_node->next; cur != NULL; cur = cur->next)
        printf("%d\n",cur->data);
}

void main()
{ 
    int data;
    struct queue *queue = (struct queue *)malloc(sizeof(struct queue));

    queue = create();
    while(1)
    {
        scanf("%d",&data);
        if(data == 0)
            break;
        else
            in_queue(queue, data);
    }

    list_queue(queue);
}