單鏈表基礎練習(第一個元素排序)

題目:已知帶頭結點單鏈表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;
}

一直將自己的學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白

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