单链表基础练习(第一个元素排序)

题目:已知带头结点单链表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;
}

一直将自己的学习经验分享给有需要的人。
我是小郑,一个坚持不懈的小白

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章