鱼C论坛

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

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

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

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

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

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

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

这是链表的头文件

  1. #if !defined (LIST_H)
  2. #define LIST_H

  3. class Link
  4. {
  5. public:
  6.         Link (int id) : _id (id) {}
  7.         Link (Link* pNext) : _pNext(pNext) {}
  8. //        Link *  SetNext(Link* pNext) { return _pNext = pNext; }
  9.         Link *  Next () const { return _pNext; }
  10.         int     Value () const { return _id; }
  11. private:
  12.         Link*  _pNext;
  13.         int     _id;
  14. };

  15. class List
  16. {
  17. public:
  18.         List (): _head (0), _tail (_head) {}
  19.         ~List ();
  20. private:
  21.         Link*   _head;
  22.         Link*   _tail;
  23. };

  24. List::~List ()
  25. {
  26.         // free the list
  27.         while ( _head != 0 )
  28.         {
  29.                 Link* pLink = _head;
  30.                 _head = _head->Next(); // unlink pLink
  31.                 delete pLink;
  32.         }
  33. }

  34. #endif
复制代码
下面是队列的cpp文件
  1. #include "List.h"
  2. #include <cassert>
  3. #include <iostream>

  4. const int maxPuts=8;

  5. class Queue: public List
  6. {
  7. public:
  8.         Queue();
  9.         void Put(int i);
  10.         int Get();
  11. private:
  12.         Link*  _head;
  13.         Link*  _tail;
  14. };

  15. Queue::Queue()
  16. {}

  17. void Queue::Put(int i)
  18. {
  19.         Link * newLink = new Link(i);
  20.         if(_tail == 0)
  21.         {
  22.                 _head = newLink;
  23.         }
  24.         else
  25.         {
  26.                 _tail->SetNext(newLink);
  27.         }
  28.         _tail = newLink;
  29. }

  30. int Queue::Get()
  31. {
  32.         assert(_head != 0);
  33.         int i = _head->Value();
  34.         Link * tmp = _head;
  35.         _head = _head->Next();
  36.         //Do not use recursions
  37.         tmp->SetNext(0);
  38.         delete tmp;
  39.         if(_head == 0)
  40.                 _tail = 0;
  41.         return i;
  42. }

  43. int main()
  44. {
  45.         Queue queue;
  46.         queue.Put(1);
  47.         queue.Put(2);
  48.         std::cout<<"Getting: "<<queue.Get()<<", "<<queue.Get()<<std::endl;
  49.         queue.Put(3);
  50.         std::cout<<"Getting more: "<<queue.Get()<<std::endl;
  51. }
复制代码
总是在SetNext和Value那儿出错,不会改。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-1-12 01:44:42 | 显示全部楼层
好吧,我承认我只是路过的..今天太困了..就不看程序了,明天有空再看,,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. class Link
  4. {
  5. public:
  6.         Link (int value)
  7.                 : _value (value), _pNext (0) {}
  8.         void    SetNext(Link* pNext) { _pNext = pNext; }
  9.         Link *  Next () const { return _pNext; }
  10.         int     Value () { return _value; };
  11. private:
  12.         int     _value;
  13.         Link *  _pNext;
  14. };

  15. class Queue
  16. {
  17. public:
  18.         Queue();
  19.         ~Queue();
  20.         void Put(int i);
  21.         int Get();
  22. private:
  23.         Link*  _head;
  24.         Link*  _tail;
  25. };

  26. #endif
复制代码
Queue.cpp
  1. #include "List.h"
  2. #include <cassert>
  3. #include <iostream>

  4. const int maxPuts=8;

  5. Queue::Queue()
  6.         : _head(0), _tail(0)
  7. {}

  8. void Queue::Put(int i)
  9. {
  10.         Link * newLink = new Link(i);
  11.         if(_tail == 0)
  12.         {
  13.                 _head = newLink;
  14.         }
  15.         else
  16.         {
  17.                 _tail->SetNext(newLink);
  18.         }
  19.         _tail = newLink;
  20. }

  21. int Queue::Get()
  22. {
  23.         assert(_head != 0);
  24.         int i = _head->Value();
  25.         Link * tmp = _head;
  26.         _head = _head->Next();
  27.         // don't delete recursively!
  28.         tmp->SetNext(0);
  29.         delete tmp;
  30.         if(_head == 0)
  31.                 _tail = 0;
  32.         return i;
  33. }

  34. Queue::~Queue()
  35. {
  36.         while(_head != 0)
  37.         {
  38.                 Link* pLink = _head;
  39.                 _head = _head->Next();
  40.                 delete pLink;
  41.         }
  42. }

  43. int main()
  44. {
  45.         Queue queue;
  46.         queue.Put(1);
  47.         queue.Put(2);
  48.         std::cout<<"Getting: "<<queue.Get()<<", "<<queue.Get()<<std::endl;
  49.         queue.Put(3);
  50.         std::cout<<"Getting more: "<<queue.Get()<<std::endl;
  51. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-22 20:35:17 | 显示全部楼层
谢谢LZ分享啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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