双链表队列

2016-10-26  本文已影响18人  b6aed1af4328
#include<stdio.h>//双链表队列
#include<stdlib.h>

typedef struct Queue
{
    int num;
    struct Queue *pre;
    struct Queue *next;
}Queue;

typedef struct pQueue
{
    struct Queue *first;
    struct Queue *tail;
}pQueue;

pQueue *createQueue(pQueue *queueHead)//这里需要返回值,为什么?因为地址传的
{                                       //是NULL。
    if(queueHead==NULL)
    {
        queueHead=(pQueue *)malloc(sizeof(pQueue));
        queueHead->first=queueHead->tail=NULL;
        return queueHead;
    }
    return queueHead;
}

int getNum()
{
    int number;
    printf("请输入数据\n");
    scanf("%d",&number);
    return number;
}

void tailInsertData(pQueue *queueHead)
{
    if(queueHead==NULL)
    {
        printf("队列没有创建\n");
        return;
    }
    if(queueHead->first==NULL&&queueHead->tail==NULL)
    {
        Queue *p=(Queue *)malloc(sizeof(Queue));
        p->pre=NULL;
        p->next=NULL;
        p->num=getNum();
        queueHead->first=p;
        queueHead->tail=p;
    }
    Queue *p=(Queue *)malloc(sizeof(Queue));
        p->num=getNum();
    queueHead->tail->next=p;
    p->next=NULL;
    p->pre=queueHead->tail;
    queueHead->tail=p;
}

void headDeleteData(pQueue *queueHead)
{
    if(queueHead==NULL)
    {
        printf("队列没有建立\n");
        return;
    }
    if(queueHead->first==NULL&&queueHead->tail==NULL)
    {
        printf("没有数据供删除\n");
        return;

    }
    if(queueHead->first==queueHead->tail)
    {
        free(queueHead->first);
        queueHead->first=NULL;
        queueHead->tail=NULL;
        return;
    }
    Queue *p=queueHead->first;
    queueHead->first=p->next;
    p->next->pre=NULL;
    free(p);
}

void printData(pQueue *queueHead)
{
    Queue *p=queueHead->first;
    for(;p!=NULL;p=p->next)
    {
        printf("[%d]<->",p->num);
    }
    printf("NULL\n");
}


void main()
{
    pQueue *queueHead=NULL;
    int select;
    while(1)
    {
        printf("=========\n");
        printf("1.创建队列\n");
        printf("2.插入数据\n");
        printf("3.删除数据\n");
        printf("4.显示数据\n");
        printf("5.退出程序\n");
        scanf("%d",&select);
        switch(select)
        {
            case 1:
            queueHead=createQueue(queueHead);
                break;
            case 2:
                tailInsertData(queueHead);
                break;
            case 3:
                headDeleteData(queueHead);
                break;
            case 4:
                printData(queueHead);
                break;
            case 5:
                return;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读