首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求解:用指针实现队列有关问题

2012-09-17 
求解:用指针实现队列问题。帮我看看下面代码哪里出错了哈。#include stdio.h#include malloc.h#include

求解:用指针实现队列问题。
帮我看看下面代码哪里出错了哈。

#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;
}


还有那主函数要怎么写的啊?
新手学习中。

[解决办法]
献丑了

C/C++ code
#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;} 

热点排行