#ifndef EXAM_H
#define EXAM_H
#include <stdio.h>
#include <stdlib.h>
//计算字符数组的长度
int my_strlen(const char *str)
{
if(str == NULL)
{
return 0;
}
int i = 0;
while(str[i] != '\0')
{
i++;
}
return i;
}
//计算排列组合的个数
int my_arr_count(int len)
{
int sum = 1;
int i;
for(i = 1; i <= len; i++)
{
sum = sum*i;
}
return sum;
}
//指针数组初始化
void p_arr_init(char **arr, int len)
{
if(arr == NULL)
{
printf("arr=NULL\n");
return;
}
int i;
for(i = 0; i < len; i++)
{
arr[i] = (char*)malloc(len*sizeof(char) + 1);
if(arr[i] == NULL)
{
printf("malloc faile!! arr[%d]\n",i);
}
}
return;
}
//指针数组空间释放
void p_arr_free(char **arr, int len)
{
if(arr == NULL)
{
return;
}
int i;
for(i = 0; i < len; i++)
{
if(arr[i] != NULL)
{
free(arr[i]);
arr[i] = NULL;
}
}
return;
}
//字符串复制函数
void my_cpy(const char *input, char *output)
{
if(input == NULL || output == NULL)
{
return;
}
int i = 0;
while(input[i] != '\0')
{
output[i] = input[i];
i++;
}
output[i] = input[i];
return;
}
//字符串比较函数
int my_cmp(const char *input, const char *output, int strlen)
{
if(input == NULL || output == NULL)
{
return 10086;
}
int i;
for(i = 0; input[i] == output[i] && input[i] != '\0'; i++)
{
;
}
if(input[i] == output[i])
{
return 0;
}
else if(input[i] < output[i])
{
return -1;
}
else if(input[i] > output[i])
{
return 1;
}
else
{
//printf("Unknow!!!\n");
return 10086;
}
}
//单个字符交换函数
void str_swap(char *a, char *b)
{
char t = *a;
*a = *b;
*b = t;
return;
}
//字符串交换
void str_swaps(char *a, char *b, int strlen)
{
char t[strlen];
my_cpy(a,t);
my_cpy(b,a);
my_cpy(t,b);
return;
}
/*******************在生成结果的过程中排序********************/
void testing_sort(char **arr, int n, int strlen)
{
if(n > 0)
{
int i;
for(i = n; i > 0; i--)
{
if(my_cmp(arr[i],arr[i-1],strlen) == -1)
{
str_swaps(arr[i],arr[i-1],strlen+1);
}
else if(my_cmp(arr[i],arr[i-1],strlen) == 1 || my_cmp(arr[i],arr[i-1],strlen) == 0)
{
return;
}
}
}
return;
}
/*************************************************************/
int n = 0;
//实现排列组合功能
void arr_com(char *input, char **output, int count, int strlen)
{
if(count > strlen)
{
my_cpy(input, output[n]);
testing_sort(output, n, strlen);
n++;
}
else
{
for(int i = count; i <= strlen; i++)
{
str_swap(&input[count], &input[i]);
arr_com(input, output, count+1, strlen);
str_swap(&input[count], &input[i]);
}
}
return;
}
/*************************快排********************************/
//对字符串数组进行排序
int my_sort(char **arr, int start, int end, int strlen)
{
char temp[strlen];
my_cpy(arr[start], temp);
while(start < end)
{
while(start<end && (my_cmp(arr[end],temp, strlen) == 0 || my_cmp(arr[end], temp, strlen) == 1))
{
end--;
}
str_swaps(arr[end], arr[start], strlen);
while(start<end && (my_cmp(arr[start],temp, strlen) == 0 || my_cmp(arr[start], temp, strlen) == -1))
{
start++;
}
str_swaps(arr[start], arr[end], strlen);
}
my_cpy(temp, arr[start]);
return start;
}
void Sort(char **arr, int start, int end, int strlen)
{
if(start < end)
{
int temp = my_sort(arr, start, end, strlen);
Sort(arr, start, temp-1, strlen);
Sort(arr, temp+1, end, strlen);
}
}
/*************************************************************/
//打印出排列组合结果
void my_printf(char **input, int arrnum)
{
int i;
for(i = 0; i < arrnum; i ++)
{
printf("%s\n", input[i]);
}
}
//对一个字符串进行排列组合测试
void test(const char *input)
{
if(input == NULL)
{
return;
}
int len = 0;
len = my_strlen(input);
int arrnum = 0;
arrnum = my_arr_count(len);
//printf("arrnum = %d\n", arrnum);
char *arr[arrnum];
p_arr_init(arr, arrnum);
char temp[len+1];
my_cpy(input, temp);
arr_com(temp, arr, 0, len-1);
my_printf(arr, arrnum);
p_arr_free(arr, arrnum);
}
#endif // EXAM_H