http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1
一、双向链表的定义
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
注意:在实现的过程中,要分清前驱指针和后继指针,不要把他们当成一个指针。
1 //双向链表的实现 2 template<typename T>struct node{ 3 T data; 4 node<T> *prior,*next; 5 };
二、双向链表的实现
1 template<typename T>class nLink 2 { 3 private: 4 node<T> *head; 5 public: 6 nLink() 7 { 8 head=new node<T>; 9 head->next=head->prior=NULL; 10 } 11 ~nLink() 12 { 13 14 } 15 //清空双链表 16 void clearLink() 17 { 18 node<T> *p=head->next,*q=NULL; 19 while(p) 20 { 21 q=p->next; 22 delete p; 23 p=q; 24 } 25 head->next=NULL; 26 } 27 //销毁双链表 28 void destoryLink() 29 { 30 clearLink(); 31 if (head) 32 { 33 delete head; 34 head=NULL; 35 } 36 } 37 //打印双链表 38 void printLink() 39 { 40 node<T> *p=head->next; 41 while(p) 42 { 43 44 cout<<p->data<<" "; 45 p=p->next; 46 } 47 cout<<endl; 48 } 49 //在双链表末尾添加结点 50 bool appendLink(T e) 51 { 52 node<T> *p=head,*s=NULL; 53 s=new node<T>; 54 if (s==NULL) 55 return false; 56 s->data=e; 57 s->next=s->prior=NULL; 58 while(p->next) 59 { 60 p=p->next; 61 } 62 p->next=s; 63 s->prior=p; 64 return true; 65 } 66 //获取链表的长度 67 int length() 68 { 69 node<T> *p=head; 70 int lenth=0; 71 if (p==NULL) 72 return 0; 73 while(p) 74 { 75 p=p->next; 76 lenth++; 77 } 78 return lenth; 79 } 80 //在第pos个位置插入新节点 81 bool insertLink(int pos,T e) 82 { 83 node<T> *p=head; 84 int posflag=0; 85 while(p&&posflag<pos-1) 86 { 87 p=p->next; 88 ++posflag; 89 } 90 node<T> *s=new node<T>; 91 if (s==NULL) 92 return false; 93 s->data=e; 94 s->next=s->prior=NULL; 95 if (p==NULL||posflag>pos-1) 96 { 97 return false; 98 } 99 s->next=p->next; 100 if(p->next!=NULL) 101 p->next->prior=s; 102 p->next=s; 103 s->prior=p; 104 return true; 105 } 106 107 //删除第i个位置上的节点 108 bool deleteLink(int pos) 109 { 110 node<T> *p=head; 111 if (pos>length()||pos<1) 112 { 113 return false; 114 } 115 int posflag=0; 116 while(p && posflag<pos-1) 117 { 118 p=p->next; 119 ++posflag; 120 } 121 if (p && p->next==NULL) 122 { 123 p->prior->next=NULL; 124 delete p; 125 p=NULL; 126 } 127 else{ 128 p->prior->next=p->next; 129 p->next->prior=p->prior; 130 delete p; 131 p=NULL; 132 } 133 return true; 134 } 135 136 //删除制定元素的节点 137 bool deleteLink(T e) 138 { 139 node<T> *p=head; 140 while (p) 141 { 142 if (p->data==e) 143 { 144 break; 145 } 146 p=p->next; 147 } 148 if(p==NULL) 149 { 150 cout<<"can not find the elem:"<<e<<endl; 151 return false; 152 } 153 //判断要删除的是不是尾节点 154 if (p->next==NULL) 155 { 156 p->prior->next=NULL; 157 delete p; 158 p=NULL; 159 } 160 else{ 161 p->prior->next=p->next; 162 p->prior=p->next->prior; 163 delete p; 164 p=NULL; 165 } 166 return true; 167 } 168 };
测试工作
1 int main() 2 { 3 nLink<char> link; 4 for (int i=0;i<10;i++) 5 { 6 link.appendLink('a'+i); 7 } 8 link.insertLink(11,'s'); 9 cout<<"Length:"<<link.length()<<endl; 10 link.printLink(); 11 link.deleteLink('s'); 12 link.printLink(); 13 cout<<"Length:"<<link.length()<<endl; 14 system("pause"); 15 return 0; 16 }
参考地址:http://www.oschina.net/code/snippet_250934_12063