数据结构学习(C++)之单链表
r = NULL; } //这部分函数返回类型为Node<Type>指针,是扩展List功能的接口 Node<Type> *pGet() { return current; } Node<Type> *pNext() { prior = current; current = current->link; return current; } Node<Type> *pGetNext() { return current->link; } Node<Type> *pGetFirst() { return first; } Node<Type> *pGetLast() { return last; } Node<Type> *pGetPrior() { return prior; } void PutLast(Node<Type> *p) { last = p; } //这部分插入删除函数不建立或删除节点,是原位操作的接口 void Insert(Node<Type> *p) { p->link = current->link; current->link = p; } void InsertBefore(Node<Type> *p) { p->link = current; prior->link = p; prior = p; } void LastInsert(Node<Type> *p) { p->link = NULL; last->link = p; last = p; } Node<Type> *pRemove() { if (current != NULL && prior != NULL) { Node<Type> *p = current; prior->link = current->link; current = current->link; return p; } else return NULL; } Node<Type> *pRemoveAfter() { if (current->link != NULL && current != NULL) { Node<Type> *p = current->link; current->link = current->link->link; return p; } else return NULL; } private: List(const List<Type> &l); Node<Type> *first, *current, *prior, *last; //尽量不要使用last,如果非要使用先用End()使指针last正确 }; #endif 【说明】我将原书的游标类Iterator的功能放在了链表类中,屏蔽掉了返回值为Node以及Node*类型的接口,这样的链表简单、实用,扩充性能也很好。 在完成书后作业的时候,我发现了原书做法的好处,也就是我的做法的不足。如果使用原书的定义,在完成一个功能时,只需要写出对应的函数实现。而在我的定义中,必须先派生一个类,然后把这个功能作为成员或者友元。但是这种比较并不说明书上的定义比我的要合理。首先,使用到原位操作的情况并不多,书后作业只是一种特殊情况;换句话说,书上的定义只是对完成书后作业更实用些。其次,在使用到链表的时候,通常只会用到插入、删除、取数据、搜索等很少的几个功能,我的定义足够用了。而在完成一个软件时,对链表的扩充功能在设计阶段就很清晰了,这时可以派生一个新类在整个软件中使用,对整体的规划更为有利。而对于单个链表的操作,把它作为成员函数更好理解一些。也就是说我的定义灵活性不差。 单链表应用 有人曾经建议最好把链表和链表位置这两个分开,C++标准库是这么做的;但对于初学者来说,一个类总比两个类好操作。我不清楚在书中这部分的程序究竟调没调试,但这种语句我是绝对看不懂的: ListNode<Term> *pa, *pb, *pc, *p;
pa, pb, p 究竟指向什么?你说这很清楚,ListNode<Term>这样的节点呗。但按照原书的定义,ListIterator::First()等等函数返回是指向data域的指针,他们怎么能直接赋值?到了下面更乱了,pb指向的区 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |