单链表,写程序总被打断,NND,最近烦死了

代码
  1 #include <stdio.h>
  2 #include <iostream>
  3 using namespace std;
  4 
  5 template <typename T>
  6 class SLink;
  7 
  8 template <typename T>
  9 class SLinkNode
 10 {
 11 public:
 12     SLinkNode(T data);
 13     SLinkNode();
 14     ~SLinkNode();
 15     SLinkNode<T> *next;
 16     T get_data(){return m_data;};
 17     friend class SLink<T>;
 18 protected:
 19 private:
 20     T m_data;
 21 };
 22 
 23 template<class T>
 24 SLinkNode<T>::SLinkNode(T data)
 25 {
 26     m_data = data;
 27     next = NULL;
 28 }
 29 
 30 template<class T>
 31 SLinkNode<T>::SLinkNode()
 32 {
 33     m_data = 0;
 34     next = NULL;
 35 }
 36 
 37 template<class T>
 38 SLinkNode<T>::~SLinkNode()
 39 {
 40     cout << "deconstruction \n";
 41 }
 42 
 43 
 44 /* ================================================*/
 45 template<class T>
 46 class SLink
 47 {
 48 public:
 49     SLink();
 50     ~SLink();
 51     int insert_node(SLinkNode<T> *_node);
 52     int delete_node();
 53     int get_length();
 54     int sort_link();
 55     int invert_link();
 56     void SLinkPrint();
 57     SLinkNode<T> *head;
 58     SLinkNode<T> *curr_ptr;
 59     //SLinkNode<T> *next;
 60 protected:
 61 private:
 62 };
 63 
 64 template<typename T>
 65 SLink<T>::SLink()
 66 {
 67     head = NULL;
 68     curr_ptr = NULL;
 69 }
 70 
 71 template <typename T>
 72 SLink<T>::~SLink()
 73 {
 74     curr_ptr = head;
 75     int cnt = 0;
 76     while(NULL != curr_ptr)
 77     {
 78         cout << "delete " << cnt << "\n";
 79         delete_node();
 80         cnt++;
 81     }
 82 }
 83 
 84 /*
 85     插入实际上是在末尾处插入
 86 */
 87 template <typename T>
 88 int SLink<T>::insert_node(SLinkNode<T> *_node)
 89 {
 90     if (NULL == _node)
 91     {
 92         return 0;
 93     }
 94     
 95     if (NULL == head)
 96     {
 97         head = _node;
 98         curr_ptr = head;
 99         return 1;
100     }
101 
102     if (NULL == curr_ptr->next)
103     {
104         curr_ptr->next = _node;
105     }
106     else
107     {
108         SLinkNode<T> *temp_next = curr_ptr->next;
109         curr_ptr->next = _node;
110         _node->next = temp_next;
111     }
112     return 1;
113 }
114 
115 
116 /*
117     单链表的数据中删除时必须是删除head处的节点
118 */
119 template <typename T>
120 int SLink<T>::delete_node()
121 {
122     if (NULL == head)
123     {
124         return 1;
125     }
126     else if (curr_ptr == head )
127     {
128         SLinkNode<T> *temp = head;
129         curr_ptr = head->next;
130         head = curr_ptr;
131         free(temp);
132         temp = NULL;
133     }
134     else
135     {
136 //         SLinkNode<T> *temp_node = curr_ptr;
137 //         curr_ptr = curr_ptr->next;
138 //         free(temp_node);
139 //         temp_node = NULL;
140     }
141     return 1;
142     
143 }
144 
145 template <typename T>
146 int SLink<T>::get_length()
147 {
148     int len = 0;
149     SLinkNode<T> *ptr = head;
150     while(NULL != ptr)
151     {
152         len++;
153         ptr = ptr->next;
154     }
155     return len;
156 }
157 
158 template <typename T>
159 int SLink<T>::sort_link()
160 {
161     // insert sort
162     int len = get_length();
163     SLinkNode<T> *node_i;
164     SLinkNode<T> *node_j;
165     T temp;
166     for (node_i = head; NULL != node_i->next; node_i = node_i->next)
167     {
168         for (node_j = node_i->next; NULL != node_j; node_j = node_j->next)
169         {
170             if (node_i->m_data > node_j->m_data)
171             {
172                 temp = node_i->m_data;
173                 node_i->m_data = node_j->m_data;
174                 node_j->m_data = temp;
175             }
176         }
177     }
178     return 1;
179 }
180 
181 template <typename T>
182 int SLink<T>::invert_link()
183 {
184     int len = get_length();
185     int half_len = len >> 1;
186     int cnt = len - 1;
187     int i = 0, j = 0;
188     T temp;
189     SLinkNode<T> *ptr;
190     SLinkNode<T> *according_ptr;
191     for (ptr = head; i < half_len; ptr = ptr->next) // do half_len times
192     {
193         // for every time, here
194         according_ptr = ptr;
195         j = 0;
196         while(j < cnt)
197         {
198             according_ptr = according_ptr->next;
199             j++;
200         }
201         temp = according_ptr->m_data;
202         according_ptr->m_data = ptr->m_data;
203         ptr->m_data = temp;
204         i++;
205         cnt -= 2;
206     }
207     return 1;
208 }
209 
210 template <typename T>
211 void SLink<T>::SLinkPrint()
212 {
213     SLinkNode<T> *ptr = head;
214     while(NULL != ptr)
215     {
216         cout << ptr->get_data() << endl;
217         ptr = ptr->next;
218     }
219 }
220 
221 void main()
222 {
223     SLink<double> SL;
224     double data;
225     for (int i = 0; i < 10; i++)
226     {
227         data = rand() % 1000;
228         SLinkNode<double> *node = new SLinkNode<double>(data);
229         SL.insert_node(node);
230     }
231     cout << "original data:\nLength of the link: " << SL.get_length() << "\n";
232     SL.SLinkPrint();
233     SL.sort_link();
234     cout << "after sorted:\n";
235     SL.SLinkPrint();
236     cout << "after invert:\n";
237     SL.invert_link();
238     SL.SLinkPrint();
239 }

 

posted @ 2010-03-19 13:40  wlu  阅读(391)  评论(0编辑  收藏  举报