鱼C论坛

 找回密码
 立即注册
查看: 2446|回复: 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;
};
出现的错误:

错误列表

错误列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-21 10:22:50 | 显示全部楼层
希望有写过栈链表的指点一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有加,这个写有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-22 14:30:42 | 显示全部楼层
我自己写了一个
#define TYLIST(T)  ListNode<T>*
//template<typename T>
//struct ListNode{
//        //数据成员
//        struct ListNode<T> *pre, *next;//双向列表
//        T info;
//        //构造函数
//        ListNode(){};
//        ListNode(T e, TYLIST(T) p1, TYLIST(T) p2) :info(e), pre(p1), next(p2){};//在函数形参之后大括号之前:是初始化操作
//        //操作接口
//        TYLIST(T) Insertpre(T const&el);//在当前节点之后插入节点
//        TYLIST(T) Insertnext(T const&el);//插入操作,在当前节点之后插入节点
//};//节点类
//template<typename T>
//TYLIST(T) ListNode<T>::Insertpre(T const &el)
//{
//        TYLIST(T) N = new ListNode(el,pre,this);
//        pre->next = N;
//        pre = N;//即,在this和this->pre之间插入N,建立相互之间的链接
//        return N;
//}
//template<typename T>
//TYLIST(T) ListNode<T>::Insertnext(T const &el)
//{
//        TYLIST(T) N= new ListNode(el,this,next);
//        next->pre = N;
//        next = N;
//        return N;
//}
template<class T>
class ListNode {
public:
        ListNode<T> *pre, *next;
        T info;
        //构造函数
        ListNode(){};
        ListNode(T e, TYLIST(T) p1, TYLIST(T) p2) :info(e), pre(p1), next(p2){};//在函数形参之后大括号之前:是初始化操作
        //操作接口
        TYLIST(T) Insertpre(T const&el);//在当前节点之后插入节点
        TYLIST(T) Insertnext(T const&el);//插入操作,在当前节点之后插入节点
};
template<typename T>
TYLIST(T) ListNode<T>::Insertpre(T const &el)
{
        TYLIST(T) N = new ListNode(el,pre,this);
        pre->next = N;
        pre = N;//即,在this和this->pre之间插入N,建立相互之间的链接
        return N;
}
template<typename T>
TYLIST(T) ListNode<T>::Insertnext(T const &el)
{
        TYLIST(T) N= new ListNode(el,this,next);
        next->pre = N;
        next = N;
        return N;
}
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-22 16:07:03 | 显示全部楼层
来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你这样是吧结点和操作放到了同一个类里。而我是把结点作为一个类,然后操作作为友元
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

#include<iostream>
template <class T>
/*struct Node        <----SUCCEED
{
        T data;
        Node<T> *link;
};*/        
class Node
{
        friend class LinkedStack;
private :
        T data;
        Node<T> *link;
};
template <class T>
class LinkedStack
{
        public :
                LinkedStack(){top = 0;}
                ~LinkedStack();
                bool IsEmpty() const {return top == NULL;}
                bool IsFull() const;
                T Top() const;
                LinkedStack<T>& Add(const T& x);
                LinkedStack<T>& Delete(T& x);
        private :
                Node<T> *top;        //指向栈顶结点 
};
template <class T>
LinkedStack<T>::~LinkedStack()
{
        Node<T> *next;
        while(top)
        {
                next = top -> link;
                delete top;
                top = next;
        }
}
template<class T>
bool LinkedStack<T>::IsFull()const
{
        //堆栈是否满
        Node<T> *p = new Node<T>;
        if(p == NULL)
                return true;
        return false;
}
template<class T>
T LinkedStack<T>::Top()const
{
        //返回栈顶元素
        if(IsEmpty()) exit(1);
        return top->data;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Add(const T& x)
{
        //添加元素x
        Node<T> *p = new Node<T>;
        p->data = x;
        p->link = top;
        top = p;
        return *this;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Delete(T& x)
{
        if(IsEmpty()) exit(1);
        x = top -> data;
        Node<T> *p = top;
        top = top->link;
        delete p;
        return *this;
}
#endif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 04:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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