初學者編程練習2

1. 給定一個鏈表N,將其逆置;

    [Version 1: Accepted 2013/03/05]

// File name: inverse_link.h

#ifndef _INVERSE_LINK_H_
#define _INVERSE_LINK_H_

#define MAX_LEN 100

#include <stdio.h>
#include <stdlib.h>

struct node{
	int data;
	node* next;
};

struct inverse_array{
	int start;
	int in_array[MAX_LEN];
};

struct node* create_link(char* file_name, struct node* head);
struct node* make_node(int temp);

struct inverse_array* make_array();
int inverse_link(struct node* head, struct inverse_array* i_array);
int write_array(char* file_name, struct inverse_array* i_array);
void free_node(struct node* head);

#endif


 

// File name: inverse_link.cpp

#include "inverse_link.h"

struct node* create_link(char* file_name, struct node* head)
{
	int temp = 0;
	FILE* fp = NULL;
	struct node* p = NULL;
	struct node* p_pre = NULL;

	head = NULL;

	if((fp = fopen(file_name, "r")) == NULL)
	{
		printf("Can not open the file!\n");
		exit(-1);
	}        // 打開文件

	while(!feof(fp))      //創建鏈表
	{
		fscanf(fp, "%d", &temp);
		p = make_node(temp);
		if(p_pre == NULL)   head = p_pre = p;
		else  
		{
			p_pre->next = p;
			p_pre = p;
		}
	}

	fclose(fp);  

	return head;
}

struct node* make_node(int temp)   //創建新節點
{
	struct node* p_node = NULL;

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

struct inverse_array* make_array()   //新建逆序數組結構
{
	int i = 0;
	struct inverse_array* p_node = NULL;

	p_node = (struct inverse_array*) malloc(sizeof(struct inverse_array));
	if(p_node == NULL)
	{
		printf("Allocation fails!\n");
		exit(-1);
	}
	p_node->start= MAX_LEN;
	for(i = 0; i < MAX_LEN; i++)  	(p_node->in_array)[i] = 0;
	return p_node;
}

int inverse_link(struct node* head, struct inverse_array* i_array)
{
	struct node* p = NULL;

	p = head;
	while(p != NULL)
	{
		i_array->start = i_array->start - 1;    //逆序數組的起始下標減一
		if(i_array->start < 0)   //若下標小於0,則數組溢出
		{
			printf("Too manys nodes. Please adjust the value of MAX_LEN!\n");
			exit(-1);
		}
		(i_array->in_array)[i_array->start] = p->data;   //寫入數據
		p = p->next;
	}
	return 0;
}
 
int write_array(char* file_name, struct inverse_array* i_array)    //將逆序序列寫入文件
{
	int i = 0;
	FILE* fp = NULL;

	if((fp = fopen(file_name, "w")) == NULL)
	{
		printf("Can not open the file!\n");
		exit(-1);
	}

	for(i = i_array->start; i < MAX_LEN; i++)
	{
		fprintf(fp, "%d    ", (i_array->in_array)[i]);
	}
	fclose(fp);
	return 0;
}

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

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


int main()
{
	char file_name_in[100] = "data.txt";
	char file_name_out[100] = "inverse_data.txt";
	struct node* head = NULL;
	struct inverse_array* i_array = NULL;

	head = create_link(file_name_in, head);    //建立數據鏈表
	i_array = make_array();
	inverse_link(head, i_array);   //逆序鏈表
	write_array(file_name_out, i_array);    //將逆序序列寫入文件
    free_node(head);
	free(i_array);

	return 0;
}


 

 Another version is expected.

// Argument: the given linked list (a pointer to the header of the list);

// Return value: the reversed linked list (a pointer to the header of the inversed list); 

 struct node* inverse(struct node* head);

 

[Version 2: Accepted: 2013/03/06]

// File name: inverse_link.h

#ifndef _INVERSE_LINK_H_
#define _INVERSE_LINK_H_

#include <stdio.h>
#include <stdlib.h>

struct node{
	int data;
	node* next;
};

struct node* create_link(char* file_name, struct node* head);
struct node* make_node(int temp);
struct node* inverse_link(struct node* head);
void print(struct node* head);
void free_node(struct node* head);

#endif


 

// File name: inverse_link.cpp

#include "inverse_link.h"

struct node* create_link(char* file_name, struct node* head)
{
	int temp = 0;
	FILE* fp = NULL;
	struct node* p = NULL;
	struct node* p_pre = NULL;

	head = NULL;

	if((fp = fopen(file_name, "r")) == NULL)
	{
		printf("Can not open the file!\n");
		exit(-1);
	}        // 打開文件

	while(!feof(fp))      //創建鏈表
	{
		fscanf(fp, "%d", &temp);
		p = make_node(temp);
		if(p_pre == NULL)   head = p_pre = p;
		else  
		{
			p_pre->next = p;
			p_pre = p;
		}
	}

	fclose(fp);  

	return head;
}

struct node* make_node(int temp)   //創建新節點
{
	struct node* p_node = NULL;

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

struct node* inverse_link(struct node* head)
{
	struct node* p = NULL;
	struct node* q = NULL;
	struct node* start = NULL;

	if(head == NULL)    return NULL;
	p = head->next;
	start = head;
	start->next = NULL;
	while(p != NULL)
	{
		q = p ->next;
		p->next = start;
		start = p;
		p = q;
	}
	return start;
}

void print(struct node* head)
{
	while(head != NULL)
	{
		printf("%d    ", head->data);
		head = head->next;
	}
	printf("\n");
}

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

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

int main()
{
	char file_name[100] = "data.txt";
	struct node* head = NULL;

	head = create_link(file_name, head);    //建立數據鏈表
	print(head);
	head = inverse_link(head);   //逆序鏈表
	print(head);
    free_node(head);

	return 0;
}


Well done !

 

2. 完善文本加密與解密器;

    [以後再完善]

3. 寫出歸併排序算法。

    [ Accepted: 2013/03/06]

int merge_sort(int data[], int first, int last)    //歸併排序
{
	int mid = 0;
	
	if(first < last)
	{
		mid = (last + first) / 2;
		merge_sort(data, first, mid);       //歸併排序前半部分
		merge_sort(data, mid + 1, last);    //歸併排序後半部分
		merge(data, first, mid, last);      //合併前後部分
	}
	return 0;
}

int merge(int data[], int first, int middle, int last)   //將2個有序數組合並
{
	int k = 0;
	int i = first;
	int j = middle + 1;
	int temp[MAX_LEN] = {0};


	while ((i <= middle) && (j <= last))
	{
		if (data[i] < data[j])      temp[k++] = data[i++];
		else if(data[i] > data[j])  temp[k++] = data[j++];   //若兩數不等 則將較小數放入temp中
		else 
		{
			temp[k++] = data[i++];
			temp[k++] = data[j++];    //若兩數相等 則兩個數均放入temp中
		}
	}
	while (i <= middle)		temp[k++] = data[i++];
	while (j <= last)		temp[k++] = data[j++];

	k = 0;
	for (i = first; i <= last; i++)
		data[i] = temp[k++];          //將有序序列放回data

	return 0;
}


程序在進行數組訪問時採用了具有“副作用”的操作,極易導致程序出錯,增加調試難度。

發佈了28 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章