初学者编程练习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;}
程序在进行数组访问时采用了具有“副作用”的操作,极易导致程序出错,增加调试难度。
- 初学者编程练习2
- 初学者编程练习1
- 初学者编程练习3
- Java初学者编程练习锦集(1)
- 编程练习2
- 编程进阶练习2
- c++编程练习2
- 编程练习(2)
- 编程小练习(2)
- 编程练习2
- 编程练习(2)
- 编程小练习2
- 编程练习(2)
- 编程练习2
- 线程编程练习2
- 编程练习2
- 编程练习(2)
- 一个编程初学者的成长历程2
- hdu3336
- GIS在商业中的应用
- 【hdu3555】【数位DP】Bomb
- 谁来签署项目的完工报告
- 字符串处理:0xABCD,如果是大端规则,在内存中CD存在高地址位,AB存在低位,printf的时候先打CD,再打AB
- 初学者编程练习2
- [转载]The TTY demystified
- php出错Warning: Cannot modify header information - headers already sent by (output started at
- shell脚本--建立办公室名录
- 迷宫求解
- 遍历Map的四种方法
- c语言数据类型
- 九度1006 ZOJ问题 浙大考研机试题
- 建表并对表进行增删改查