typedef int QDataType;
typedef struct QueueNode{
QueueNode* next;
QDataType data;
}QNode;
typedef struct Queue{ //多个值需要指针
QueueNode* head;
QueueNode* tail;
}Queue;
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
void QueueDestroy(Queue* pq)
{
assert(pq);
QueueNode* cur = pq->head;
while(cur!=NULL)
{
QueueNode* next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq,ODataType x);
{
assert(pq);
//开辟一个新的结点
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->data = x;
newnode->next = NULL;
if(pq->head == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
ps->tail = newnode;
}
}
void QueuePop(Queue* pq);
{
}
ODataType QueueFront(Queue* pq);
ODataType QueueBack(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);
void TestQueue1()
{
Queue q;
QueueInit(&q);
QueuePush(&q,1);
}
int main(int argc, char *argv[]) {
//TextStack();
//TextStack2();
TestQueue1();
return 0;
}
有几处报错不会改
以下是修改后的代码,主要是在QueuePush和QueuePop函数中,由于中英文符号问题,产生了一些错误:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QDataType;
typedef struct QueueNode {
struct QueueNode* next;
QDataType data;
} QNode;
typedef struct Queue {
QNode* head;
QNode* tail;
} Queue;
void QueueInit(Queue* pq) {
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
void QueueDestroy(Queue* pq) {
assert(pq);
QNode* cur = pq->head;
while (cur != NULL) {
QNode* next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, QDataType x) {
assert(pq);
//开辟一个新的结点
QNode* newnode = (QNode*)malloc(sizeof(QNode));
newnode->data = x;
newnode->next = NULL;
if (pq->head == NULL) {
pq->head = pq->tail = newnode;
}
else {
pq->tail->next = newnode;
pq->tail = newnode;
}
}
void QueuePop(Queue* pq) {
assert(pq);
if (pq->head == NULL) {
return;
}
QNode* oldhead = pq->head;
pq->head = oldhead->next;
if (pq->head == NULL) {
pq->tail = NULL;
}
free(oldhead);
}
QDataType QueueFront(Queue* pq) {
assert(pq);
return pq->head->data;
}
QDataType QueueBack(Queue* pq) {
assert(pq);
return pq->tail->data;
}
int QueueSize(Queue* pq) {
assert(pq);
int size = 0;
QNode* cur = pq->head;
while (cur != NULL) {
size++;
cur = cur->next;
}
return size;
}
bool QueueEmpty(Queue* pq) {
assert(pq);
return pq->head == NULL;
}
void TestQueue1() {
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
while (!QueueEmpty(&q)) {
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
printf("\n");
}
int main(int argc, char* argv[]) {
TestQueue1();
return 0;
}
这样,代码就可以编译通过并正常运行了。在QueuePush函数中,我们使用了链表的尾插法来插入新节点,即将新节点接到链表尾部,然后移动tail指针。在QueuePop函数中,我们使用了链表的头删法来弹出队首元素,即将头指针移向下一个元素,并释放原头结点的内存空间。
void QueuePush(Queue* pq,ODataType x);
这里多了分号
QueuePop没有写
void QueuePop(Queue* pq)
{
assert(pq && pq->head);
QueueNode* next = pq->head->next;
free(pq->head);
pq->head = next;
if(!pq->head)
pq->tail = NULL;
}