单链表的实现(带头结点与不带头结点)c++语言

本人弱鸡,在学数据结构,学到链表这一章,思索实践搜集资料了好几天才对单链表有了一些理解。现在整理一些代码与感悟,希望看到这篇文章也同样在学链表的童鞋能有所感悟,少走些弯路。

结点类(我比较喜欢用结构体,这样可避免友元的问题,也比较清晰) :

template <class T>
struct chainNode {
	T data;
	chainNode<T> *link;
	chainNode(chainNode <T> *pre = NULL) { link = pre; }
	chainNode(const T& item, chainNode<T> *pre = NULL) {
		data = item;
		link = pre;
	}
};

注意上述结构体中的两个构造函数,first = new chainNode<T>; 调用的便是第一个构造函数,这个first指针指向的便是不带值的头结点(头结点也可以带值,但不算是我们期待的链表中的值)。

first = new chainNode<T>(x),这调用的是第二个构造函数,这时候链表便不带头结点。

List类:

template <class T>
class List {
public:
	List() { first = new chainNode<T>; } //带头结点
	List(const T& x) { first = new chainNode<T>(x); } //这是不带头结点的
	List(List<T> &L); //复制构造函数
	~List() { makeEmpty(); }
	chainNode<T>* locate(int i); //返回链表中第i个元素的地址
	void makeEmpty(); //将链表清空
	bool IsEmpty() const { return first->link == NULL ? true : false; }
	void inputFront(T endTag);
	void inputRear(T endTag);
	int length() const; //计算带有头结点的链表的长度
	int search(T &x); //返回链表第一个x是第几个值
	void find(int k, T& x); //找到链表中第k个元素,并把它的值赋给x
	void output(ostream& out);
	bool remove(int k, T& x);
	bool insert(int k, T& x);
	void reverse(
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值