问题描述:同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);
}