題目:已知帶頭結點單鏈表L,設計算法實現:以表中第一個元素作爲標準,將表中所有值小於第一個元素 的結點均放在第一個結點之前 ,所有值大於 第一個元素的結點均放在第一個元素結點之後。
這是一個強行分類的方式……
#include<stdio.h>
#include<stdlib.h>
struct Node{
int data;
Node *next;
};
//合併
Node* connect(Node* big, Node* small, int count, int num){
Node* r, *ans;
ans = (Node*)malloc(sizeof(Node));
r = (Node*)malloc(sizeof(Node));
ans->next=NULL;
//頭插法
r = big->next;
while(r!=NULL){
Node* s = (Node*)malloc(sizeof(Node));
s->data = r->data;
s->next = ans->next;
ans->next = s;
r = r->next;
}
for(int i=0; i<count; i++){
Node* s = (Node*)malloc(sizeof(Node));
s->data = num;
s->next = ans->next;
ans->next = s;
}
r = small->next;
while(r!=NULL){
Node* s = (Node*)malloc(sizeof(Node));
s->data = r->data;
s->next = ans->next;
ans->next = s;
r = r->next;
}
//釋放空間
r = small;
while(r!=NULL){
Node* s = r->next;
free(r);
r = s;
}
r = big;
while(r!=NULL){
Node* s = r->next;
free(r);
r = s;
}
return ans;
}
//排序
Node* sort(Node* top, int num){
Node *r, *big_ans, *small_ans, *ans, *s;
r = (Node*)malloc(sizeof(Node));
ans = (Node*)malloc(sizeof(Node));
big_ans = (Node*)malloc(sizeof(Node));
small_ans = (Node*)malloc(sizeof(Node));
big_ans->next = NULL;
small_ans->next = NULL;
r = top->next;
int count = 0;
while(r!=NULL){
Node* tmp;
tmp = (Node*)malloc(sizeof(Node));
if(r->data < num){
tmp->data = r->data;
tmp->next = small_ans->next;
small_ans->next = tmp;
}
else if(r->data > num){
tmp->data = r->data;
tmp->next = big_ans->next;
big_ans->next = tmp;
}
else if(r->data == num){
count++;
}
r = r->next;
}
r = top;
while(r!=NULL){
Node* s = r->next;
free(r);
r = s;
}
ans = connect(big_ans, small_ans, count, num);
return ans;
}
int main(){
int len, num; //鏈表長度、第一元素
Node* top, *r, *ans;
scanf("%d", &len);
top = (Node*)malloc(sizeof(Node));
r = (Node*)malloc(sizeof(Node));
top->data=0;
top->next = NULL;
for(int i=1; i<=len; i++){ //建立鏈表(頭插法)
Node* s = (Node*)malloc(sizeof(Node));
scanf("%d", &s->data);
if(i==1){
num = s->data;
}
s->next=top->next;
top->next=s;
}
ans = (Node*)malloc(sizeof(Node));
ans = sort(top, num);
r = ans->next;
while(r!=NULL){
printf("%d ", r->data);
r = r->next;
}
return 0;
}
一直將自己的學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白