求解:用指针实现队列问题。
帮我看看下面代码哪里出错了哈。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef char QItem;
typedef struct qnode *qlink;
struct qnode{QItem element;qlink next;}Qnode;
typedef struct lque *Queue;
typedef struct lque{
qlink front;
qlink rear;
}Lqueue;
Queue QueueInit()
{
Queue Q=malloc(sizeof *Q);
Q->front=Q->rear=0;
return Q;
}
int QueueEmpty(Queue Q)
{
return Q->front==0;
}
int QueueFull(Queue Q)
{
return QMemFull();
}
int QMemFull()
{
qlink p;
if((p=malloc(sizeof(Qnode)))==0) return 1;
else {free(p);return 0;}
}
QItem QueueFirst(Queue Q)
{
if(QueueEmpty(Q))
printf("Queue is empty");
return Q->front->element;
}
QItem QueueLast(Queue Q)
{
if(QueueEmpty(Q))
printf("Queue is empty");
return Q->rear->element;
}
void EnterQueue(QItem x,Queue Q)
{
qlink p;
p=NewQNode();
p->element=x;
p->next=0;
if(Q->front) Q->rear->next=p;
else Q->front=p;
Q->rear=p;
}
QItem DeleteQueue(Queue Q)
{
qlink p;QItem x;
if(QueueEmpty(Q))
printf("Queue is empty");
x=Q->front->element;
p=Q->front;
Q->front=Q->front->next;
free(p);
return x;
}
还有那主函数要怎么写的啊?
新手学习中。
[解决办法]
献丑了
#include <iostream>using std::cin;using std::cout;using std::endl;template<typename QElemType> class LinkQueue;template<typename QElemType> class QNode{ friend class LinkQueue<QElemType>;protected: QElemType data; QNode<QElemType> *next;public: QNode<QElemType>() { } QNode<QElemType>(const QElemType &dt, QNode *nx) { data = dt; next = nx; } ~QNode<QElemType>() { } QElemType GetData() { return data; } QNode *GetNext() { return next; } void SetData(const QElemType &dt) { data = dt; } void SetNext(QNode *nx) { next = nx; }};template<typename QElemType> class LinkQueue{protected: QNode<QElemType> *front; // 队头指针 QNode<QElemType> *rear; // 队尾指针public: LinkQueue<QElemType>() { InitQueue(); } LinkQueue<QElemType>(const LinkQueue<QElemType> &lq); // 拷贝构造函数 ~LinkQueue<QElemType>() { DestroyQueue(); } bool InitQueue(); // 构造一个空队列 bool DestroyQueue(); // 销毁队列 bool ClearQueue(); // 清空队列 bool QueueEmpty() { return (front == rear); } // 控空 int QueueLength(); // 求队列长度 bool GetHead(QElemType &e); // 取队头元素 bool EnQueue(const QElemType &e); // 入队 bool DeQueue(QElemType &e); // 出队 void QueueTraverse(void (*visit)(const QElemType &e)) const; // 遍历};// 拷贝构造函数template<typename QElemType>LinkQueue<QElemType>::LinkQueue<QElemType>(const LinkQueue<QElemType> &lq){ // 未实现}// 构造一个空队列template<typename QElemType> bool LinkQueue<QElemType>::InitQueue(){ front = new QNode<QElemType>; if (front == NULL) return false; rear = front; rear->next = NULL; return true;}// 销毁队列template<typename QElemType> bool LinkQueue<QElemType>::DestroyQueue(){ while (front != NULL) { rear = front->next; delete front; front = rear; } return true;}// 清空队列template<typename QElemType> bool LinkQueue<QElemType>::ClearQueue(){ while (front->next != NULL) { rear = front->next; delete front; front = rear; } return true;}// 求队列长度template<typename QElemType> int LinkQueue<QElemType>::QueueLength(){ QNode<QElemType> *p; int cnt = 0; for (p = front->next; p != NULL; p = p->next) ++cnt; return cnt;}// 取队头元素template<typename QElemType> bool LinkQueue<QElemType>::GetHead(QElemType &e){ if (front == rear) return false; e = front->next->data; return true;}// 入队template<typename QElemType> bool LinkQueue<QElemType>::EnQueue(const QElemType &e){ QNode<QElemType> *p = new QNode<QElemType>(e, NULL); if (p == NULL) return false; rear->next = p; rear = p; return true;}// 出队template<typename QElemType> bool LinkQueue<QElemType>::DeQueue(QElemType &e){ QNode<QElemType> *p; if (front == rear) return false; p = front->next; e = p->data; front->next = p->next; // 当队列中最后一个元素被删后,队列尾指针也丢失了, // 因此需要对队尾指针重新赋值(指向头结点) if (rear == p) rear = front; delete p; return true;}// 遍历template<typename QElemType>void LinkQueue<QElemType>::QueueTraverse(void (*visit)(const QElemType &e)) const{ QNode<QElemType> *p = front->next; while (p != NULL) { visit(p->data); p = p->next; }}template <typename QElemType> void display(const QElemType &e){ cout.width(4); cout << e;}int main(){ LinkQueue<int> lq; int choose, i, elem; bool result; for (i = 0; i < 115; ++i) lq.EnQueue(5 * i); do { do { cout << "请选择:" << endl; cout << "1.队列置空" << endl; cout << "2.探空" << endl; cout << "3.求元素的个数" << endl; cout << "4.求队头元素的值" << endl; cout << "5.入队" << endl; cout << "6.出队" << endl; cout << "7.遍历" << endl; cout << "8.退出" << endl; cin >> choose; if (choose < 1 || choose > 8) cout << "输入有误,请重新输入" << endl; else break; } while (true); switch (choose) { case 1: lq.ClearQueue(); cout << "队列已置空" << endl; break; case 2: result = lq.QueueEmpty(); if (result) cout << "当前队列为空" << endl; else cout << "当前队列不为空" << endl; break; case 3: cout << "当前队列中有" << lq.QueueLength() << "个元素" << endl; break; case 4: result = lq.GetHead(elem); if (result) cout << "队头元素值为" << elem << endl; else cout << "当前队列空" << endl; break; case 5: cout << "请输入元素值" << endl; cin >> elem; result = lq.EnQueue(elem); if (result) cout << "入队成功" << endl; else cout << "入队失败" << endl; break; case 6: result = lq.DeQueue(elem); if (result) cout << "出队成功。元素" << elem << "出队" << endl; else cout << "出队失败" << endl; break; case 7: cout << "当前队列中的所有元素为" << endl; lq.QueueTraverse(display); cout << endl; break; case 8: goto END; default: break; } cout << endl << endl; } while (true);END: system("pause"); return 0;}