初学者编程练习3

1. 快速排序算法

    [Accepted 2013/03/12]

void quick_sort(int data[], int low, int high) {        //对data[]做快速排序
	int pivoc = 0;

	if(low < high) {                                    //长度大于1
		pivoc = patition(data, low, high);              //将data[]一分为二
		quick_sort(data, low, pivoc - 1);               //快速排序左边
		quick_sort(data, pivoc + 1, high);              //快速排序右边
	}
}

int patition(int data[], int low, int high) {          //将data[]一分为二
	int m = 0;
	int i = 0;
	int j = 0;
	int temp = 0;

	m = data[low];                                     //记录基准的值
	if(low < high) {
		i = low;
		j = high + 1;
		do {

			do {
				i = i + 1;
			}while(data[i] < m && i < high);
			do {
				j = j - 1;
			}while(data[j] > m && j > low);

			temp = data[i];                        //交换data[i]和data[j]
			data[i] = data[j];
			data[j] = temp;
		}while(i < j);

		temp = data[i];                            //交换data[i]和data[j]
		data[i] = data[j];
		data[j] = temp;

		temp = data[j];                           //交换data[low]和data[j]
		data[j] = data[low];
		data[low] = temp;
	}
	return j;                                     //返回j
}

 

Well done !

Every morning, you and sunshine ~

 

2. 以“Move-to-Front” 方式编写一个动态线性查找表

   [Acceptd: 2013/03/12]

struct node* insert(struct node* head, int temp) {
	int flag = 0;
	struct node* q = NULL;
	struct node* p = NULL;
	struct node* p_pre = NULL;

	if(head == NULL) {                      //head为空 直接返回q
		q = make_node(temp); 
		return q;                     
	}
	p = p_pre = head;
	if(p->data == temp)   return head;     //temp与第一个数据相等 返回head
	p = p->next;
	while(p != NULL) {
		if(p->data == temp) {              //遍历链表查找temp数据
			flag = 1;
			break;
		}
		p_pre = p;
		p = p->next;
	}
	if(flag == 1) {                      //链表中存在temp数据, 将该节点放在头部
		p_pre->next = p->next;
		p->next = head;
		head = p;
	}
	else {                               //链表中不存在temp数据,新建节点,并放在头部
		q = make_node(temp);
		q->next = head;
		head = q;
	}
	return head;
}
 
struct node* make_node(int temp)         //建立新节点
{ 
	struct node* q = NULL;

	q = (struct node*)malloc(sizeof(struct node));
	if(q == NULL) {
		printf("Allocation fails!");
		exit(-1);
	}
	q->data = temp;
	q->next = NULL;   
	return q;
}

void print(struct node* head) {         //打印链表
	struct node* p = head;
	
	while(p != NULL) {
		printf("%d    ", p->data);
		p = p->next;
	}

	printf("\n");
}

int main() {
	int temp = 0;
	FILE* fp = NULL;
	char file_name[50] = "data.txt";
	struct node* head = NULL;

	if((fp = fopen(file_name, "r")) == NULL) {
		printf("File open error!");
		exit(-1);
	}

	while(!feof(fp)) {
		fscanf(fp, "%d", &temp);        //读取data
		head = insert(head, temp);      //插入节点
		print(head);                    //打印链表
	}

	return 0;
}


 

3. 以“Move-One-Step” 方式编写一个动态线性查找表

   [Accepted: 2013/03/13]

struct node* insert(struct node* head, int temp) {
	int flag = 0;
	struct node* p = NULL;
	struct node* q = NULL;
	struct node* p_pre = NULL;

	if(head == NULL) {
		q = make_node(temp);
		return q;
	}

	p = head;
	while(p != NULL) {
		if(p->data == temp) {
			flag = 1;
			break;
		}
		p_pre = p;
		p = p->next;
	}
	if(flag == 0) {
		q = make_node(temp);
		q->next = head;
		return q;
	}
	if(p_pre != NULL) {
		p->data = p_pre->data;
		p_pre->data = temp;
	}
	return head;
}

struct node* make_node(int temp)
{
	struct node* q = NULL;

	q = (struct node*)malloc(sizeof(struct node));
	if(q == NULL) {
		printf("Allocation fails!");
		exit(-1);
	}
	q->next = NULL;
	q->data = temp;
	return q;
}

void print(struct node* head) {
	struct node* p = NULL;

	p = head;
	while(p != NULL) {
		printf("%d    ", p->data);
		p = p->next;
	}
	printf("\n");
}

void free_list(struct node* head) {
	struct node* p = NULL;
	struct node* q = NULL;

	p = head;
	while(p != NULL) {
		q = p->next;
		free(p);
		p = q;
	}
}

int main() {
	int temp = 0;
	FILE* fp = NULL;
	char file_name[50] = "data.txt";
	struct node* head = NULL;

	if((fp = fopen(file_name, "r")) == NULL) {
		printf("File open error!");
		exit(-1);
	}

	while(!feof(fp)) {
		fscanf(fp, "%d", &temp);
		head = insert(head, temp);
		print(head);
	}

	free_list( head);
	fclose(fp);
	return 0;
}

速度越来越快啦,(*^__^*) 嘻嘻……

 

本周加试一题:

4.(附加题) 编程判断一个有限单向链表是否含有一个环(节点数未知)。

    [Accepted 2013/03/21]

bool is_loop(struct node* head) {                      //判断环是否存在
	struct node* fast = head;
	struct node* slow = head;
	
	if(head == NULL)  {
		printf("The link is empty!\n");
		return false;
	}
	if(head->next == NULL)   return false;
	while(1) {
		slow = slow->next;
		if(slow == NULL)    return false;
		fast =fast->next;
		if(fast == NULL) 	return false;
		fast =fast->next;
		if(fast == NULL) 	return false;
		if(fast == slow)    return true;
	}
}


 

发布了28 篇原创文章 · 获赞 4 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章