給定 n 個字符串:abc dca add ae…
最終排序結果爲:abc ae add dca
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
char need_arr[] = "abcdefghijklmnopqrstuvwxyz";
typedef char *Words;
Words *wordarr; //wordarr中存放分割完成的字符串
int arrsize = 0;; //分割完成的字符串的個數
#define MAXWORDS 1000 //wordarr能存放的字符串最大值
#define MAXWORDSLEN 20 //字符串的最大長度
//字符串分割
bool splitstr(char *str)
{
if(str == NULL)
{
return false;
}
int i = 0;
wordarr = (char**)malloc(sizeof(Words) * MAXWORDS);
char *s = strtok(str, " ");
while(s != NULL)
{
printf("%s\n", s);
wordarr[i] = (char *)malloc(sizeof(s) + 1);
memset(wordarr[i], 0, MAXWORDSLEN);
strcpy(wordarr[i], s);
i++;
s = strtok(NULL, " ");
}
arrsize = i;
return true;
}
static int Position(char *str, char c)
{
assert(str != NULL);
char *tmp = strchr(str, c);
if(tmp == NULL)
{
return -1;
}
return (tmp - str) / sizeof(char);
}
//根據自己制定的字符串順序表比較字符串的大小
int ComStr(char *str1, char *str2)
{
int result = 0;
int i = 0;
int len = strlen(str1)>strlen(str2) ? strlen(str2) : strlen(str1);
while(result == 0 && i < len)
{
if((Position(need_arr, str1[i])) > (Position(need_arr, str2[i])))
{
return 1;
}
else if((Position(need_arr, *(str1+i))) < (Position(need_arr, str2[i])))
{
return -1;
}
else
{
return 0;
}
i++;
}
if(result == 0)
{
if(strlen(str1) > strlen(str2))
{
return 1;
}
else if(strlen(str1) < strlen(str2))
{
return -1;
}
}
}
//交換字符串,小的字符串放前面
int SwitchStr(char **str1, char **str2)
{
char *tmp;
tmp = *str1;
if((ComStr(*str1, *str2)) > 0)
{
*str1 = *str2;
*str2 = tmp;
}
return 0;
}
//冒泡排序
int Sort_Word(Words *words)
{
int i;
int j;
for(i=0; i<arrsize; i++)
{
for(j=i+1; j<arrsize; j++)
{
SwitchStr((words+i),(words+j));
}
}
return 0;
}
int main()
{
char str[] = "abc acd auh dn dj mx mdc kf uf lcm ld ueh hdb svx oos";
printf("%s\n", str);
if(splitstr(str))
{
Sort_Word(wordarr);
}
for(int i=0; i<arrsize; i++)
{
printf("%s ", wordarr[i]);
}
printf("\n");
return 0;
}
運行結果: