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;
}
程序在进行数组访问时采用了具有“副作用”的操作,极易导致程序出错,增加调试难度。