鱼C论坛

 找回密码
 立即注册
查看: 2102|回复: 3

用链表实现队列,我的代码错在哪儿呢?

[复制链接]
发表于 2014-1-8 23:14:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 andalousie 于 2014-1-8 23:16 编辑

我在看一本叫做《C++实践之路》的书。习题里面的。编不对。。

这是链表的头文件

#if !defined (LIST_H)
#define LIST_H

class Link
{
public:
        Link (int id) : _id (id) {}
        Link (Link* pNext) : _pNext(pNext) {}
//        Link *  SetNext(Link* pNext) { return _pNext = pNext; }
        Link *  Next () const { return _pNext; }
        int     Value () const { return _id; }
private:
        Link*  _pNext;
        int     _id;
};

class List
{
public:
        List (): _head (0), _tail (_head) {}
        ~List ();
private:
        Link*   _head;
        Link*   _tail;
};

List::~List ()
{
        // free the list
        while ( _head != 0 )
        {
                Link* pLink = _head;
                _head = _head->Next(); // unlink pLink
                delete pLink;
        }
}

#endif
下面是队列的cpp文件
#include "List.h"
#include <cassert>
#include <iostream>

const int maxPuts=8;

class Queue: public List
{
public:
        Queue();
        void Put(int i);
        int Get();
private:
        Link*  _head;
        Link*  _tail;
};

Queue::Queue()
{}

void Queue::Put(int i)
{
        Link * newLink = new Link(i);
        if(_tail == 0)
        {
                _head = newLink;
        }
        else
        {
                _tail->SetNext(newLink);
        }
        _tail = newLink;
}

int Queue::Get()
{
        assert(_head != 0);
        int i = _head->Value();
        Link * tmp = _head;
        _head = _head->Next();
        //Do not use recursions
        tmp->SetNext(0);
        delete tmp;
        if(_head == 0)
                _tail = 0;
        return i;
}

int main()
{
        Queue queue;
        queue.Put(1);
        queue.Put(2);
        std::cout<<"Getting: "<<queue.Get()<<", "<<queue.Get()<<std::endl;
        queue.Put(3);
        std::cout<<"Getting more: "<<queue.Get()<<std::endl;
}
总是在SetNext和Value那儿出错,不会改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-12 01:44:42 | 显示全部楼层
好吧,我承认我只是路过的..今天太困了..就不看程序了,明天有空再看,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-21 18:24:59 | 显示全部楼层
好吧,我自己终于会实现链队列了。改出来了。。。公布一下答案吧
List.h
#if !defined (LIST_H)
#define LIST_H

class Link
{
public:
        Link (int value) 
                : _value (value), _pNext (0) {}
        void    SetNext(Link* pNext) { _pNext = pNext; }
        Link *  Next () const { return _pNext; }
        int     Value () { return _value; };
private:
        int     _value;
        Link *  _pNext;
};

class Queue
{
public:
        Queue();
        ~Queue();
        void Put(int i);
        int Get();
private:
        Link*  _head;
        Link*  _tail;
};

#endif
Queue.cpp
#include "List.h"
#include <cassert>
#include <iostream>

const int maxPuts=8;

Queue::Queue()
        : _head(0), _tail(0)
{}

void Queue::Put(int i)
{
        Link * newLink = new Link(i);
        if(_tail == 0)
        {
                _head = newLink;
        }
        else
        {
                _tail->SetNext(newLink);
        }
        _tail = newLink;
}

int Queue::Get()
{
        assert(_head != 0);
        int i = _head->Value();
        Link * tmp = _head;
        _head = _head->Next();
        // don't delete recursively!
        tmp->SetNext(0);
        delete tmp;
        if(_head == 0)
                _tail = 0;
        return i;
}

Queue::~Queue()
{
        while(_head != 0)
        {
                Link* pLink = _head;
                _head = _head->Next();
                delete pLink;
        }
}

int main()
{
        Queue queue;
        queue.Put(1);
        queue.Put(2);
        std::cout<<"Getting: "<<queue.Get()<<", "<<queue.Get()<<std::endl;
        queue.Put(3);
        std::cout<<"Getting more: "<<queue.Get()<<std::endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-22 20:35:17 | 显示全部楼层
谢谢LZ分享啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 11:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表