码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构--双链表的创建和操作

时间:2015-06-26 14:57:09      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

双向链表的定义

  双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

  注意:在实现的过程中,要分清前驱指针和后继指针,不要把他们当成一个指针。

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

 

数据结构--双链表的创建和操作

标签:

原文地址:http://www.cnblogs.com/jingliming/p/4602144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!