网络推荐



本广告位招租!

推荐给好友 上一篇 | 下一篇

模板实现的链表

BSD爱好者乐园cYqo&|i7o"h:j N

堆栈链表看起来简单,真让写,还是有一定困难的。动手用模板实现链表,练练手。BSD爱好者乐园(ej%V5^KY

W"Q*g4~Pg/H7m)D#include<iostream>BSD爱好者乐园:?T9F xl'oB
using namespace std;BSD爱好者乐园![Z$hv{.s

_'R`4y'Uxtemplate <class T>BSD爱好者乐园a3L:A U0\T8m
class Node {
h ^FGa1C{+RAotpublic:BSD爱好者乐园!ih^)h{qq
    Node(T e, Node *ptr=NULL) : data(e), next(ptr) {};BSD爱好者乐园KB!l%H-l
    T data;BSD爱好者乐园g P#b%[5Z:x!F
    Node *next;
5v6N*rAh V};BSD爱好者乐园(P!n:M K-X,_ WSa#C

BSD爱好者乐园9i$K"c4s~%A|m

template <class T>BSD爱好者乐园ZR fc-WR4AM E
class List {
q)MC V6d-q%OR`(apublic:BSD爱好者乐园1p Y7LK;T!{[
    List() { head=tail=NULL; };
Iu4qaT%[d    ~List();
:DYjA.fF2}$Wp    bool isEmpty() {return (head == NULL)};                //检查List是否为空

%G3{v6sE{1Z+C

'_5S{Xw4C;D4E+|    void addToHead(T);                //插入头节点

x o'jUwM vH;XBSD爱好者乐园/eq0r~d-\

    void addToTail(T);                //插入尾节点

O4a.I~F5`BSD爱好者乐园"E([r ] G/e'O,xi C

    T delFromHead();                //删除头结点BSD爱好者乐园X&i/vN:Z*]T

\}o+h? f)E0J r    T delFromTail();                //删除尾节点BSD爱好者乐园#un D#uP)r%dR

BSD爱好者乐园1ZT!Q`+U^^^ @Z)g

    int isInList(T) const;            //查找指定元素是否在List中,有则返回第一次找到匹配的位置(从0开始),没有则返回-1BSD爱好者乐园4n@4JC-} ?u8v[x

BSD爱好者乐园 v$p ]jh0w0dC4?

    void deleteNode(T);                //删除指定元素节点

;|/n i*Y+pc

ARg.S(`};?H.o!E//private:

+u u+x%L*P4j N

+} J$IkC p?o    Node<T> *head,*tail;            //模板类用的时候记得这么写 Node<T>BSD爱好者乐园0W S`+Ih \E'j

DbRZ+D y!x K};

U:EAMkBSD爱好者乐园iE3YmO,qJ;J+Hr

template <class T>
Jh,w9rf"])h.l4`List<T>::~List() {            //注意类成员函数定义使用模板时的格式 template<class T> List<T>::~List(){...}

;[*Fi;~[9Ro*|BSD爱好者乐园 F3CYjkB/O!f

    Node<T> *ptr;
3J'aTT0^:X|!o |    while(head != NULL)        //List不为空

#D^PL%^ M3Q$?}/q

)kjTDf ] mD    {
l0xsD3b i        ptr = head;BSD爱好者乐园.Z~ |,sAj4hb
        head = head->next;
$`g!t+qF%t{p`        delete ptr;
&S i9t{H7A _b    }BSD爱好者乐园"A:v#z`-] mHj
}BSD爱好者乐园)QC%xle\.s

nBx7nv7|template <class T>BSD爱好者乐园)W9p xSm?3s*mB CS
void List<T>::addToHead(T data) {
!tR r h(i    head = new Node<T>(data, head);BSD爱好者乐园 ^{*dhYt)sM
    if (tail == NULL)        //原来List为空的话,tail和head都指到该节点上

T f._lCk| JBSD爱好者乐园"_Su_8P(i

        tail = head;BSD爱好者乐园JNkw?W[[&|
}

&Y]3K4to

;n0Ef/aA?v;Itemplate <class T>BSD爱好者乐园[#p?r8G
void List<T>::addToTail(T data) {
8F|ys1P]Gi|    if (tail == NULL)
'ZS(\uE A[        head = tail = new Node<T>(data);
X6x,Tt7zL:qpI    else        //原来List不空,加到末尾

8q&k6d@d0]'o+?

(h.EI'AvM    {
ACy+y`#i(em        tail->next = new Node<T>(data);
U1STkdU2`Q uv@#S        tail = tail->next;
-eU~2^6EXko    }BSD爱好者乐园JaVo6kq$dh
}BSD爱好者乐园0Y!wyC7U

BSD爱好者乐园]!Oo/A"?8}[L

template <class T>
kO[0up(DT List<T>::delFromHead() {
w ` fU{p~1o    if(head == NULL)        //List为空BSD爱好者乐园k C^&w$C0W4i Q/Yd9QA

+q;qf KA8e3k ?$WIr4\    {BSD爱好者乐园~)R[5]-D!D-c0?
        cerr << "List is empty! Fail to delete from head." << endl;
8C)_cU1E        exit(1);
l.s4z,l\5a!C    }
O8C aP2sR yw    T e = head->data;
#eWp#u d.YE9a    Node<T> *ptr = head;BSD爱好者乐园 Xw _&Z#Q
    if(head == tail)        //只有一个节点BSD爱好者乐园I8~? pf%H'yW`

IZf"h%P.Lik6[        head = tail = NULL;BSD爱好者乐园|6h9S]m&a7?2K\N3d
    else                    //不只一个节点

k twel6Y tD5cBSD爱好者乐园0}p!@ IC&J\c8_L,~}

        head = head->next;BSD爱好者乐园8s$Z4Mr C[ L

BSD爱好者乐园ozhU L tk

    delete ptr;        //释放内存BSD爱好者乐园d5?'H4lX

R1WnBgS/V    return e;
Y V5i M\}U}BSD爱好者乐园7OzN?'p*[%u

BSD爱好者乐园q(Jh'sA1K9J(I

template <class T>
B3m8f.U4n HET List<T>::delFromTail() {
Ct!Of+\ Kc    if(tail == NULL)        //List为空

-S kEG)H

yy4O'LYvW'E{    {
2L XJxV*DP'Z&x        cerr << "List is empty! Fail to delete from tail." << endl;
S `.Tfi?(i        exit(1);
shNt%E6xGJ9Oe    }
_6Yz-We#H;x"F    T e = tail->data;BSD爱好者乐园NM hYH+[$Z
    Node<T> *ptr;
r+BMzO    if(tail == head)        //只有一个节点BSD爱好者乐园ZbB9O@G#b/K(O

BSD爱好者乐园g$P*i!AR~

    {BSD爱好者乐园G9Yx~R{,Ra[:t'U
        ptr = tail;
$T,c$f(CM8_z+S'U5|        tail = head = NULL;BSD爱好者乐园-Ojt_ @U
        delete ptr;            //释放内存BSD爱好者乐园ZY(~fa n R1[

W.P ]FZhy    }
F6V'r e dOT i    else                    //不止一个节点BSD爱好者乐园8d J.\@cM1C ?/^)N/Cj/Z^f

$mvoB_AA;pP?    {
/VS {};FbQz        ptr = head;
s2U&@7\"pl        while(ptr->next != tail)        //使ptr->next == tail;

g6k)EU0L2{4Q

8|C/y"QH+h,Gxwc            ptr = ptr->next;BSD爱好者乐园$M[;q(\ S!TN W
        delete tail;
jd/vP\9x l l        tail = ptr;
}*sp|f        tail->next = NULL;            //这步不要忘了,使tail->next = NULL;

lp6M2W}TGkBSD爱好者乐园"N[ h$j J8{

    }BSD爱好者乐园d1gE!P(o:I-T
    return e;BSD爱好者乐园"i#D*X5_4gu/p He5B]r
}

1Cf`TV)}*]0UQp#UBSD爱好者乐园m$[Im c0vH

template <class T>BSD爱好者乐园? T/@u8p u'i
int List<T>::isInList(T data) const{        //const函数体在声明和定义时都要写明const

^$e ].mH q_ k(i

!Yq$\F2[ `    Node<T> *ptr = head;
V@ o Sp0Eo    for(int index = 0; ptr->next != NULL; index++) {BSD爱好者乐园A*Pb K"^
        if(ptr->data == data)
/y_B$Oy            return index;
x~Z!}0si    }
E If(l6A$W;gvT    return -1;        //没有找到返回-1

ud7P8?Y?1W*T

NQsA L&S2w.q}

d"|;^j1{~nBSD爱好者乐园x `2z6V(aT.h!G)`5K0N.Q

template <class T>BSD爱好者乐园 g7z$F]G1}
void List<T>::deleteNode(T data) {BSD爱好者乐园3F jc/}oN6\
    if (head == NULL)            //检查List是否为空BSD爱好者乐园n9X.c}e m

$M0q \ Ho:y-Ye%G&n`    {
7Pp{gd        cerr << "List is empty." << endl;
oR`;F)zdG Ss]n        return;BSD爱好者乐园 h/A1{[(cM`s
    }
6]#AGM~Zj\*S    else if (head == tail)            //只有一个节点

*J%`"Os}j

-Nf KQd*_Di    {
^ wa$NK7xhp        if (data == head->data) {        //如果data == head->dataBSD爱好者乐园G0|2ZCn9T.Ss7b

|6g6~'x0{&\            delete head;
?#vz8A ` C            head = tail = NULL;BSD爱好者乐园C i}'U+l
        }BSD爱好者乐园 q P,\#S oq#J*W@
        else {
:E2Di2l#A$NBQ^5U            cerr << "Data is no found." << endl;BSD爱好者乐园 jGv[ bp qY \O
            return;BSD爱好者乐园4d pl,X$t*y
        }BSD爱好者乐园e?3l(r VoO
    }BSD爱好者乐园L7B-w2A7_OMO
    else                //有多个节点

L\.y${7N/{ n8P

}s-\ ]4wobL    {
j e,GSLX        if (data == head->data) {        //如果data == head->data

n o AaaH1dRBSD爱好者乐园7Vbo6W!J%{_@D.}~

            Node<T> *ptr = head;BSD爱好者乐园r'pflE })_3Em
            head = head->next;BSD爱好者乐园:\;|)v?k i
            delete ptr;BSD爱好者乐园/ZPGhy
        }
'U$?}9Pf%T        else {BSD爱好者乐园v m4VXEI
            Node<T> *ptr,*pre;BSD爱好者乐园'n Q$IL }z
            for(pre=head, ptr=head->next; (data!=ptr->data) && (ptr!=NULL); pre=ptr, ptr=ptr->next) ;        //别忘了分号BSD爱好者乐园O0z9V{I!l^x

1|8^L2T3qiL6|                if(ptr!=NULL)        //找到节点,删除

;tI [HL({BSD爱好者乐园tB ?*P C5B-]U;m

                {
'FeA0?@1iLY{]6d j                    pre->next = ptr->next;
yUt.vX&O                    if (ptr == tail)        //如果找到的节点是尾节点,则记得要重设尾节点BSD爱好者乐园|B0jCN5_

5f9v4y?+n hL                        tail = pre;
2oNE9OK8e)~ KC.L9_                    delete ptr;
n'J_7vz l}P E                }BSD爱好者乐园-XT'K;`6u N a
                else            //没有找到节点

MKc#{y0d

b0{b#Q)dm"d p0_ N                    cerr << "Data is no found." << endl;BSD爱好者乐园"_w"c0` A/j$?Q
        }
gcg;~n9M    }BSD爱好者乐园*m!b2})f+B,z
}BSD爱好者乐园sV!??NlTSk

BSD爱好者乐园-sPxl7@|`4fD~

void main()BSD爱好者乐园(^nl9aj9P1G
{
k&I;y1diZK)t    List<int> list;BSD爱好者乐园 Gf.V z:Qp8? @
    list.addToHead(1);BSD爱好者乐园MuM N2I1MW\YT
    list.addToHead(2);BSD爱好者乐园7`0O9X ~!Y0b4o9D
    list.addToHead(3);BSD爱好者乐园Xrx5cN-b8W"D wD
    list.addToHead(4);BSD爱好者乐园"pi*K$~'q.e5}'~ib
    list.addToHead(5);BSD爱好者乐园k m r$]i"iDu
    list.delFromHead();BSD爱好者乐园R ~ ]N2Q8p-e7x+ds D
    list.deleteNode(3);BSD爱好者乐园2z['@&U;J
    list.delFromTail();
7c P&{ER%v'XIb    Node<int> *p = list.head;
JG2_1b8jJ-z    while(p!=NULL)BSD爱好者乐园H'UFdr
    {BSD爱好者乐园r7^8_5~%[ j Zu
        cout << p->data << ' ';
3?'Fq x/zN        p = p->next;BSD爱好者乐园 `D,S$QZ(|V*l
    }
ha:y.y1j7a}

Z cx|[4X)A p
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: 模板 链表
 

评分:0

我来说两句

seccode