鱼C论坛

 找回密码
 立即注册
查看: 2672|回复: 7

自己写了一个模板栈,用的是链表(PS: 在链表节点这个问题上出现了问题)

[复制链接]
发表于 2016-6-21 10:21:32 | 显示全部楼层 |阅读模式

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

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

x
当使用结构体作为节点时,栈和驱动程序可以运行
可是当用一个类来代替结构体作为一个节点时,出现了各种各样的错误。
结构体:
struct Node        <----SUCCEED
{
        T data;
        Node<T> *link;
};
类 :
class Node
{
        friend class LinkedStack;
private :
        T data;
        Node<T> *link;
};
出现的错误:

错误列表

错误列表
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-21 10:22:50 | 显示全部楼层
希望有写过栈链表的指点一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-21 13:58:56 | 显示全部楼层
你少了类模板申明
  1. template<class T>
复制代码

评分

参与人数 1荣誉 +3 鱼币 +5 收起 理由
~风介~ + 3 + 5 支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-21 21:40:29 | 显示全部楼层
荒年 发表于 2016-6-21 13:58
你少了类模板申明

有加,这个写有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-22 14:30:42 | 显示全部楼层
我自己写了一个
  1. #define TYLIST(T)  ListNode<T>*
  2. //template<typename T>
  3. //struct ListNode{
  4. //        //数据成员
  5. //        struct ListNode<T> *pre, *next;//双向列表
  6. //        T info;
  7. //        //构造函数
  8. //        ListNode(){};
  9. //        ListNode(T e, TYLIST(T) p1, TYLIST(T) p2) :info(e), pre(p1), next(p2){};//在函数形参之后大括号之前:是初始化操作
  10. //        //操作接口
  11. //        TYLIST(T) Insertpre(T const&el);//在当前节点之后插入节点
  12. //        TYLIST(T) Insertnext(T const&el);//插入操作,在当前节点之后插入节点
  13. //};//节点类
  14. //template<typename T>
  15. //TYLIST(T) ListNode<T>::Insertpre(T const &el)
  16. //{
  17. //        TYLIST(T) N = new ListNode(el,pre,this);
  18. //        pre->next = N;
  19. //        pre = N;//即,在this和this->pre之间插入N,建立相互之间的链接
  20. //        return N;
  21. //}
  22. //template<typename T>
  23. //TYLIST(T) ListNode<T>::Insertnext(T const &el)
  24. //{
  25. //        TYLIST(T) N= new ListNode(el,this,next);
  26. //        next->pre = N;
  27. //        next = N;
  28. //        return N;
  29. //}
  30. template<class T>
  31. class ListNode {
  32. public:
  33.         ListNode<T> *pre, *next;
  34.         T info;
  35.         //构造函数
  36.         ListNode(){};
  37.         ListNode(T e, TYLIST(T) p1, TYLIST(T) p2) :info(e), pre(p1), next(p2){};//在函数形参之后大括号之前:是初始化操作
  38.         //操作接口
  39.         TYLIST(T) Insertpre(T const&el);//在当前节点之后插入节点
  40.         TYLIST(T) Insertnext(T const&el);//插入操作,在当前节点之后插入节点
  41. };
  42. template<typename T>
  43. TYLIST(T) ListNode<T>::Insertpre(T const &el)
  44. {
  45.         TYLIST(T) N = new ListNode(el,pre,this);
  46.         pre->next = N;
  47.         pre = N;//即,在this和this->pre之间插入N,建立相互之间的链接
  48.         return N;
  49. }
  50. template<typename T>
  51. TYLIST(T) ListNode<T>::Insertnext(T const &el)
  52. {
  53.         TYLIST(T) N= new ListNode(el,this,next);
  54.         next->pre = N;
  55.         next = N;
  56.         return N;
  57. }
复制代码

是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-22 16:07:03 | 显示全部楼层
来看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-24 11:10:22 | 显示全部楼层
荒年 发表于 2016-6-22 14:30
我自己写了一个
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习

你这样是吧结点和操作放到了同一个类里。而我是把结点作为一个类,然后操作作为友元
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-24 11:11:56 | 显示全部楼层
荒年 发表于 2016-6-22 14:30
我自己写了一个
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习

这是我单独写的栈链表
  1. #ifndef _ST_H_
  2. #define _ST_H_

  3. #include<iostream>
  4. template <class T>
  5. /*struct Node        <----SUCCEED
  6. {
  7.         T data;
  8.         Node<T> *link;
  9. };*/       
  10. class Node
  11. {
  12.         friend class LinkedStack;
  13. private :
  14.         T data;
  15.         Node<T> *link;
  16. };
  17. template <class T>
  18. class LinkedStack
  19. {
  20.         public :
  21.                 LinkedStack(){top = 0;}
  22.                 ~LinkedStack();
  23.                 bool IsEmpty() const {return top == NULL;}
  24.                 bool IsFull() const;
  25.                 T Top() const;
  26.                 LinkedStack<T>& Add(const T& x);
  27.                 LinkedStack<T>& Delete(T& x);
  28.         private :
  29.                 Node<T> *top;        //指向栈顶结点
  30. };
  31. template <class T>
  32. LinkedStack<T>::~LinkedStack()
  33. {
  34.         Node<T> *next;
  35.         while(top)
  36.         {
  37.                 next = top -> link;
  38.                 delete top;
  39.                 top = next;
  40.         }
  41. }
  42. template<class T>
  43. bool LinkedStack<T>::IsFull()const
  44. {
  45.         //堆栈是否满
  46.         Node<T> *p = new Node<T>;
  47.         if(p == NULL)
  48.                 return true;
  49.         return false;
  50. }
  51. template<class T>
  52. T LinkedStack<T>::Top()const
  53. {
  54.         //返回栈顶元素
  55.         if(IsEmpty()) exit(1);
  56.         return top->data;
  57. }
  58. template<class T>
  59. LinkedStack<T>& LinkedStack<T>::Add(const T& x)
  60. {
  61.         //添加元素x
  62.         Node<T> *p = new Node<T>;
  63.         p->data = x;
  64.         p->link = top;
  65.         top = p;
  66.         return *this;
  67. }
  68. template<class T>
  69. LinkedStack<T>& LinkedStack<T>::Delete(T& x)
  70. {
  71.         if(IsEmpty()) exit(1);
  72.         x = top -> data;
  73.         Node<T> *p = top;
  74.         top = top->link;
  75.         delete p;
  76.         return *this;
  77. }
  78. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 17:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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