链表操作 (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 }
posted @ 2012-10-07 02:40  zhengmian  阅读(6344)  评论(3编辑  收藏  举报