题目:已知带头结点单链表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;
}
一直将自己的学习经验分享给有需要的人。
我是小郑,一个坚持不懈的小白