算法导论12:队列的链表实现 2016.1.12

  普通的链表队列和栈的实现差不多,只是修改一下进出的规则即可。(感觉自己就像在翻译算法导论的伪代码一样。。不过还好吧,也有一点自己的理解)

  下面是代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct _node{
    int num;
    struct _node *next;
}node;

struct queue {
    node * head;
    node * tail;
}Q;

void build(struct queue &Q)
{
    Q.tail=(node *)malloc(sizeof(node));
    Q.tail->next=NULL;
    Q.head=(node *)malloc(sizeof(node));
    Q.head->next=Q.tail;
}

int Qempty(struct queue &Q)
{
    if ((Q.head)->next==Q.tail) return 1;
    else return 0;
}

int dequeue(struct queue &Q)
{
    if (Qempty(Q)) {
        printf("空队列!\n");
    }
    else {
        node *p;
        p=Q.head;
        Q.head=(Q.head)->next;
        int k=p->num;
        free(p);
        return k;
    }
}

void init(struct queue &Q)
{
    while (!Qempty(Q)) {
        dequeue(Q);
    }
}

void enqueue(struct queue &Q,int n)
{
    node *p;
    p=(node *)malloc(sizeof(node));
    p->num=n;
    p->next=Q.head;
    Q.head=p; 
}

void showqueue(struct queue Q)
{
    while ((Q.head)->next!=Q.tail){
        int k=(Q.head)->num;
        Q.head=(Q.head)->next;
        printf("|%d|\n",k);
    }
    printf("| |\n");
}

int main()
{
    printf("1:初始化队列;2:入队列;3:出队列;4:退出。\n");
    build(Q);
    int n;
    while (1) {
        int k;
        scanf("%d",&k);
        switch(k) {
            case 1:init(Q); break;
            case 2:scanf("%d",&n); enqueue(Q,n); break;
            case 3:dequeue(Q); break;
            case 4:return 0;
        }
        showqueue(Q);
    }    
    return 0;
}

 

posted @ 2016-01-12 12:11  lvmememe  阅读(238)  评论(0编辑  收藏  举报