用链表实现队列的功能

链表不限定元素的长度,可以动态分配元素并添加,另外经常的增删是链表优于其他数据结构的特点.

今天我们用链表来实现一个队列.

linkList.h

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define new(type) (type *)malloc(sizeof(type))
#define FREE(p)         if (p != NULL) {                free(p);                p = NULL;            }
typedef struct Node{
    int data;
    struct Node *next;
}ListNode, *pListNode;

typedef struct _Queue{
    int size;
    pListNode headLink;
    pListNode tailLink;
}Queue, *pQueue;

pQueue CreatedQueue(void);
pListNode CreateNode(int value);
pListNode popQueue(pQueue);
void pushQueue(pQueue queue, pListNode node);
void DestroyQueue(pQueue *queue);
void DestroyListNode(pListNode *node);
int LengthOfQueue(pQueue queue);
void ShowQueue(pQueue queue);

这里引进size对队列进行计数,

api中并没有判断empty 或者 full,直接用这个size即可.

linkList.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include "linkList.h"

//创建队列时,头尾指针均指向data域为0的节点.
pQueue CreatedQueue(void){
    pQueue pq = new(Queue);
    assert(pq != NULL);
    //pListNode pn = CreateNode(0);
    //assert(pn != NULL);
    pq->size = 0;
    pq->headLink = NULL; //pn;
    pq->tailLink = NULL; //pn;
    return pq;
}

pListNode CreateNode(int value){
    pListNode pn= new(ListNode);
    assert(pn != NULL);
    pn->data = value;
    pn->next = NULL;
    return pn;
}

//删除节点是删除headLink指向的节点,改变headLink指向
pListNode popQueue(pQueue queue){
    assert(queue != NULL);
    if(queue->size == 0)
        return NULL;
    pListNode pn = queue->headLink;
    queue->headLink = pn->next;
    pn->next = NULL;
    queue->size --;
    if(queue->size ==0)
        queue->tailLink = NULL;
    return pn;
}

//增加节点放在队尾,改变tailLink指向,添加第一个元素headLink和tailLink均指向这个节点
void pushQueue(pQueue queue, pListNode node){
    assert(queue != NULL);
    assert(node != NULL);
    if(queue->size == 0){
        queue->headLink = node;
        queue->tailLink = node;
    }
    else{
        queue->tailLink->next = node;
        queue->tailLink = node;
    }
    queue->size++;
}

void DestroyQueue(pQueue *queue){
    assert(*queue != NULL);
    while((*queue)->size--!=0){ //清空所有节点
        pListNode pn = popQueue(*queue);
        DestroyListNode(&pn);
    }
    //FREE(queue->headLink);
    //FREE(queue->tailLink);
    FREE(*queue);
}

void DestroyListNode(pListNode *node){
    assert(*node != NULL);
    (*node)->next = NULL;
    FREE(*node);
}

int LengthOfQueue(pQueue queue){
    assert(queue != NULL);
    assert(queue->size ==0 || queue->size > 0);
    return queue->size;
}

void ShowQueue(pQueue queue){
    pListNode pn = queue->headLink;
    if(pn == NULL)
        return ;
    printf("ShowQueue Order ");
    int length = queue->size;
    while(length--!=0){
        printf(" [%d]", pn->data);
        pn = pn->next;
    }
    printf("\n");
}

测试程序的主函数main.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include"linkList.h"

int main()
{
    pQueue pq = CreatedQueue();
    printf("Push circularQueue 1,2,3,4,5,6,7..\n");
    CreateNode(1);
    pListNode pn = CreateNode(1);
    DestroyListNode(&pn);

    pn = CreateNode(2);
    pushQueue(pq, pn);
    ShowQueue(pq);
    pn = CreateNode(3);
    pushQueue(pq, pn);
    pn = CreateNode(4);
    pushQueue(pq, pn);
    pn = CreateNode(5);
    pushQueue(pq, pn);
    pn = CreateNode(6);
    pushQueue(pq, pn);

    ShowQueue(pq);

    popQueue(pq);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);

    DestroyQueue(&pq);

    pq = CreatedQueue();
    printf("Push circularQueue 1,2,3,4,5,6,7..\n");
    CreateNode(1);
    pn = CreateNode(1);
    DestroyListNode(&pn);

    pn = CreateNode(2);
    pushQueue(pq, pn);
    ShowQueue(pq);
    popQueue(pq);
    ShowQueue(pq);
    pn = CreateNode(3);
    pushQueue(pq, pn);
    ShowQueue(pq);
    pn = CreateNode(4);
    pushQueue(pq, pn);
    ShowQueue(pq);

    return 0;
}

输出结果如下:

Push circularQueue 1,2,3,4,5,6,7..
ShowQueue Order  [2]
ShowQueue Order  [2] [3] [4] [5] [6]
ShowQueue Order  [3] [4] [5] [6]
ShowQueue Order  [4] [5] [6]
ShowQueue Order  [5] [6]
ShowQueue Order  [6]
Push circularQueue 1,2,3,4,5,6,7..
ShowQueue Order  [2]
ShowQueue Order  [3]
ShowQueue Order  [3] [4]
时间: 2024-11-08 22:48:52

用链表实现队列的功能的相关文章

两个栈实现队列的功能

//用两个栈实现队列的功能 //假设有两个栈s1与s2,则s1保存刚刚入队的元素,若需出队且s2为空,则将s1所有元素压入s2(此时s2中元素顺序为元素入队顺序),然后取出s2栈顶即可,若s2非空(此时s2中元素为s1之前压入,其栈顶就是最早入队的元素),则直接取出s2的栈顶. template<class T> class MyQueue { stack<T> s1,s2; public: MyQueue(){} int size() { return s1.size()+s2.

Java数据结构——用双端链表实现队列

//================================================= // File Name : LinkQueue_demo //------------------------------------------------------------------------------ // Author : Common //类名:FirstLastList //属性: //方法: class FirstLastList_long{ private Lin

《Java数据结构与算法》笔记-CH5-链表-5用双端链表实现队列

1 //用双端链表实现队列 2 /** 3 * 节点类 4 */ 5 class LinkQ { 6 private long data; 7 public LinkQ next; 8 9 public LinkQ(long d) { 10 this.data = d; 11 } 12 13 public String toString() { 14 return String.valueOf(this.data); 15 } 16 } 17 /** 18 * 双端链表类 19 */ 20 cl

(转载)C语言单链表实现19个功能完全详解

最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能.到目前我只写了一半,先传上来,大家有兴趣的可以帮忙指正,谢谢 在vs2010上面编译运行无错误. 每天都会把我写的新代码添加到这个里面.直到此链表完成. #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #in

栈的应用——对栈排序、用栈实现队列的功能

一:写一个算法将栈里的元素升序排列.栈的实现未知,算法只能借助栈完成,可使用的函数有push.pop.top.empty等. 思路:可借助另外一个栈来完成排序. 1.从原始栈里依次弹出元素放入辅助栈: 2.每当将要压入的元素是得辅助栈不是升序排列,就将辅助栈里面的元素重新压入原始栈中: 3.直到辅助栈里面的元素都小于当前要压入的元素: 4.压入当前的元素. 代码如下: 1 #include <iostream> 2 #include <string> 3 #include <

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner; public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;}; } public static class MyLinkedList { Node head=null; public MyLinkedList()

数据结构 - 基于链表的队列

基于链表的队列 当我们基于链表实现队列时,需要从一端加元素,另一端取出元素,就需要引入一个新的变量tail指向链表的尾部,此时,向尾部进行添加操作时间复杂度会变为O(1),然而删除操作还是需要从head向后遍历,所以此时选择链表尾为队尾,链表头为队首. 基于链表的实现的源码如下: package queue; import linkedList.LinkedList; public class LinkedListQueue<E> implements Queue<E> {    

泛型应用到链表的队列中来

package com.java.genericity.www; import java.util.LinkedList; public class GennericityDmeo { public static void main(String[] args) {  //创建一个linkedList集合  LinkedList<String> list;  //因为是内部类,所以创建对象是怎么创建的  GennericityDmeo.Queue q=new GennericityDmeo()

实现一个链表和队列

import java.text.SimpleDateFormat; import java.util.Calendar; import org.apache.log4j.Logger; /* * 实现一个泛型链表类接口, 1.链表增加一个节点, 2.指定位置增加一个节点 3.删除指定位置的节点 4.删除某种内容的所有节点 加上日志 * */ public class LinkMe { public static void main(String args[]){ //BasicConfigur