初学者编程练习2

来源:互联网 发布:多管火箭炮升级数据 编辑:程序博客网 时间:2024/05/20 00:37

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++];          //将有序序列放回datareturn 0;}


程序在进行数组访问时采用了具有“副作用”的操作,极易导致程序出错,增加调试难度。