鏈表操作 (C語言)插入,合並,銷毀,刪除,冒泡排序


  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<malloc.h>
  4 
  5 typedef  struct Node{
  6      int data;
  7      struct Node *next;
  8 }node; // 把node 聲明為struct Node.
  9 
 10 node *add(node *head, int data);
 11 node *ListDelete(node *head, int i);
 12 node *reverse(node *head);
 13 node *buddleSort(node *head);
 14 node *mergeList(node *head1,node *head2,node *head3);
 15 
 16  void listDestroy(node *head);
 17  void print(node *head);
 18  int length1(node *head);
 19 
 20 
 21  int main()
 22 {
 23     node *head1 = NULL;
 24     node *head2 = NULL;
 25     node *head3 = NULL;
 26      int i =  10;
 27      while(i-- >  0)
 28     {
 29         head1 = add(head1,rand()% 100);
 30         head2 = add(head2,rand()% 100);
 31     }
 32 
 33     buddleSort(head1);
 34     buddleSort(head2);
 35 
 36     print(head1);
 37     print(head2);
 38 
 39     head3 = mergeList(head1,head2,head3);
 40     print(head3);
 41 
 42     head3 = reverse(head3);
 43     print(head3);
 44 
 45      // listDestroy(head1);
 46       // listDestroy(head2);
 47      listDestroy(head3);
 48 
 49      return  1;
 50 }
 51 
 52  // 合並兩個基本有序的鏈表,到head3
 53  node *mergeList(node *head1,node *head2,node *head3)
 54 {
 55     node *tail = NULL;
 56      if(head1==NULL)
 57     {
 58         head3 = head2;
 59          return head3;
 60     }
 61      else  if(head2==NULL)
 62     {
 63         head3 = head1;
 64          return head3;
 65     }
 66      else
 67     {
 68          if(head1->data > head2->data)
 69         {
 70             head3 = head2;
 71             tail = head3;
 72             head2 = head2->next;
 73         }
 74          else
 75         {
 76             head3 = head1;
 77             tail = head3;
 78             head1 = head1->next;
 79         }
 80     }
 81      while(head1&&head2)
 82     {
 83          if(head1->data > head2->data)
 84         {
 85             tail->next = head2;
 86             tail = head2;
 87             head2 = head2->next;
 88         }
 89          else
 90         {
 91             tail->next = head1;
 92             tail = head1;
 93             head1 = head1->next;
 94         }
 95     }
 96     tail ->next = head1 ? head2 : head1; // 插入剩余段。
 97 
 98      return head3;
 99 }
100 
101  // 用頭插完成鏈表的反轉。
102  node * reverse(node *head)
103 {
104     node * tempHead = NULL,*p=NULL;
105      while(head)
106     {
107         p = head;
108         head = head -> next;
109         p->next = tempHead;
110         tempHead = p;
111     }
112      return tempHead;
113 }
114 
115  // 對鏈表冒泡排序 升序
116  node *buddleSort(node *head)
117 {
118      int len = length1(head);
119     node *p1 =head,*p2=head,*tempFinish=NULL;
120      while(len-- >  0)
121     {
122         p1 = p2 = head;
123          while(p2!=tempFinish)
124         {
125             p2=p2->next;
126 
127              if(p2==NULL)
128                  break;
129 
130              else  if(p1->data > p2->data)
131             {
132                 p1->data = (p1->data)^(p2->data);
133                 p2->data = (p1->data)^(p2->data);
134                 p1->data = (p1->data)^(p2->data);
135             }
136             p1 = p2;
137         }
138         tempFinish = p1;
139     }
140      return head;
141 }
142 
143  // 添加一個元素
144  node * add(node *head, int data)
145 {
146     node *p = NULL;
147      if(head==NULL)
148     {
149         head = (node*)malloc( sizeof(node));
150         head->data = data;
151         head->next = NULL;
152     }
153      else
154     {
155         p = (node*)malloc( sizeof(node));
156         p->data = data;
157         p->next = head;
158         head = p;
159     }
160      return head;
161 }
162 
163  // 刪除一個元素
164  node * ListDelete(node *head, int i)
165 {
166     node *p1,*p2;
167      if(i>length1(head))
168         printf( " 刪除位置不正確! ");
169      else
170     {
171         p1 = head;
172          if(i== 0)
173         {
174             head = head->next;
175             free(p1);
176         }
177 
178          else
179         {
180              while(--i >  0)
181             {
182                 p1 = p1->next;
183             }
184             p2 = p1->next;
185             p1->next = p1->next->next;
186             free(p2);
187         }
188 
189     }
190      return head;
191 }
192 
193  // 銷毀鏈表
194  void listDestroy(node*head)
195 {
196     node *p = head;
197     print(head);
198      while(head!=NULL)
199     {
200         head = head->next;
201         free(p);
202         p = head;
203     }
204 }
205 
206  // 查看鏈表長度
207  int length1(node *head)
208 {
209     node *p = head;
210     unsigned  int len= 0;
211      while(p!=NULL)
212     {
213         p = p->next;
214         len++;
215     }
216      return len;
217 }
218 
219  // 打印鏈表數據
220  void print(node *head)
221 {
222      while(head!=NULL)
223     {
224         printf( " %d  ",head->data);
225         head = head -> next;
226     }
227     printf( " \n ");
228 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM