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

双向链表的定义

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

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

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

 

你可能感兴趣的:(数据结构)