美文网首页
双链表队列

双链表队列

作者: b6aed1af4328 | 来源:发表于2016-10-26 20:36 被阅读18次
#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;
        }
    }
}

相关文章

  • 文章列表

    基本数据结构 栈 队列 双端队列 无序链表 有序链表 递归 递归 搜索与排序 搜索

  • 双链表队列

  • 数据结构和算法总结

    常用数据结构: 数组,栈,队列,链表(单向链表,双端链表,双向链表),哈希表(hash table),树(二叉树,...

  • Java集合系列之LinkedList源码分析

    前言 LinkedList是基于双向链表实现的,除了可以当链表来操作,它还可以当做栈,队列以及双端队列来使用,且是...

  • LinkedList的用法

    LinkedList的本质是双向链表。它也可以被当作堆栈、队列或双端队列进行操作。它采用的是链表式储存,所以比较适...

  • 数据结构-系列文章

    线性表 单链表 单链表-OC实现 双链表 循环链表 栈 栈 队列 待完善 数组 待完善 树 待完善 图 待完善 哈...

  • python常用的算法与数据结构

    栈,队列,双端队列无序链表,有序链表二叉树,堆,二叉搜索树,AVL树图以及一些算法 coding: utf-8 u...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • 并发集合8-LinkedBlockingDeque源码分析

    前言 LinkedBlockingDeque是基于双向链表的双端有界阻塞队列,使用非公平ReentrantLock...

  • STL--vector、deque、list、set、map、s

    vector(向量容器) deque(双端队列容器) list(链表容器) set(集合容器) map(映射容器)

网友评论

      本文标题:双链表队列

      本文链接:https://www.haomeiwen.com/subject/iptduttx.html