队列ADT的另一种解法

问题描述:同Queue ADT

代码:

#define _CRT_SECURE_NO_WARNINGS 1

 

#include <assert.h>

#include <stdio.h>

#include <stdlib.h>

#define length 10

typedef struct QueueNode

{

    int _data;

    struct QueueNode* _next;

}QueueNode;

typedef struct Queue

{

    QueueNode* _head;

    QueueNode* _tail;

}Queue;

void QueueInit(Queue* q)

{

    assert(&q);

    //申请空间

    q->_head = (QueueNode*)malloc(length * sizeof(QueueNode));

    if (!q->_head)

    {

        exit(0);

    }

    q->_tail = q->_head;

    q->_head->_next = NULL;

    return;

}

void QueuePush(Queue* q, int x)

{

    assert(&q);

    //申请节点空间    

    QueueNode* newNode;

    newNode = (QueueNode*)malloc(sizeof(QueueNode));

    if (NULL == newNode)

    {

        exit(0);

    }

    newNode->_data = x;

    newNode->_next = NULL;

    q->_tail->_next = newNode;

    q->_tail = newNode;

    return;

}

void QueuePop(Queue* q)

{

    assert(&q);

    if (QueueEmpty(q))

    {

        return;

    }

    QueueNode* p;

    p = q->_head->_next;//p指向第一个数据

    q->_head->_next = p->_next;//把头结点的next指向第一个数据的next

    if (q->_tail == p)//如果只剩一个元素,把tail指针指向头结点

    {

        q->_tail = q->_head;

    }

    free(p);

}

 

int QueueFront(Queue* q){

    assert(q);

    if (QueueEmpty(q))

    {

        return NULL;

    }

    return q->_head->_next->_data;

}

int QueueBack(Queue* q){

    assert(q);

    if (QueueEmpty(q))

    {

        return NULL;

    }

    return q->_tail->_data;

}

int QueueSize(Queue* q)

{

    QueueNode* p = q->_head;

    int n = 0;

    while (p != q->_tail)

    {

        n++;

        p = p->_next;

    }

    return n;

}

 

int QueueEmpty(Queue* q)

{

    return q->_head == q->_tail;

}

 

void GetSumAndAverage(Queue q, int *sum, float *aver)

{

if (q._head == q._tail) exit(1);

int len = QueueSize(&q);

printf("%d\n", len);

*sum = 0;

int i = 0;

do

{

int e = QueueFront(&q);

//int e = q._head->next->_data;

printf("%d\n", e);

*sum += e;

printf("%d\n", *sum);

QueuePop(&q);

QueuePush(&q, e);

i++;

}

while(i < len);

float s = *sum, l = len;

*aver = s / l;

}

 

int main()

{

    Queue q;

    int x = 0;

    int i = 0;

    QueueInit(&q);

for (int i=0; i<10; ++i)

{

QueuePush(&q, i);

}

int len = QueueSize(&q);

printf("len: %d\n", len);

int sum;

float aver;

GetSumAndAverage(q, &sum, &aver);

printf("sum is: %d\n", sum);

printf("average is: %f\n", aver);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值