C語言指標實現簡單佇列
阿新 • • 發佈:2018-12-22
節點結構體:
typedef struct _node
{
int data;
struct _node *next;
} Node;
佇列結構體:
typedef struct linkedlist
{
Node *head;
Node *tail;
} Queue;
操作:
//初始化佇列
void initializeQueue(Queue *queue)
{
queue->head = NULL;
queue->tail = NULL;
}
//入隊
void enQueue(Queue *queue, int data )
{
Node *node = (Node *) malloc(sizeof(Node));
node->data = data;
if (queue->head == NULL)
{
node->next = NULL;
queue->tail = node;
}
else
{
node->next = queue->head;
}
queue->head = node;
}
//出隊
int deQueue(Queue *queue )
{
Node *tmp = queue->head;
int data;
//1.只有一個元素
//2.多個元素
// a.遍歷到tail上一個tmp
// b.儲存tail的值並free tail所指向的記憶體
// c.tail指向tmp
if (queue->head == NULL)
{
data = -1;
}
else if (queue->head == queue->tail)
{
data = tmp->data;
queue ->head = queue->tail = NULL;
free(tmp);
}
else
{
while (tmp->next != queue->tail)
{
tmp = tmp->next;
}
data = queue->tail->data;
free(queue->tail);
queue->tail = tmp;
queue->tail->next = NULL;
// queue->tail = tmp;
// tmp = tmp->next;
// queue->tail->next = NULL;
// data = tmp->data;
// free(tmp);
}
return data;
}
void freeAll(Queue *queue)
{
while(deQueue(queue) != -1);
printf("\nFree Complete!\n");
return;
}
void endl()
{
printf("\n");
}
int main()
{
Queue queue;
initializeQueue(&queue);
enQueue(&queue, 1);
enQueue(&queue, 2);
enQueue(&queue, 3);
enQueue(&queue, 4);
enQueue(&queue, 5);
printf("%d\n", queue.tail->data);
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue)); //1 2
// queue : 3 4 5
endl();
enQueue(&queue, 10);
enQueue(&queue, 56);
enQueue(&queue, 999); //queue: 3 4 5 10 56 999
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue));
printf("%d ", deQueue(&queue));
freeAll(&queue);
return 0;
}
小結:佇列實現基於連結串列,enQueue入隊操作基於addHead