【问题描述】
编写一个函数void str_bin(char str1[ ], char str2[ ]), str1、str2是两个有序字符串(其中字符按ASCII码从小到大排序),将str2合并到字符串str1中,要求合并后的字符串仍是有序的,允许字符重复。在main函数中测试该函数:从键盘输入两个有序字符串,然后调用该函数,最后输出合并后的结果。
【输入形式】
分行从键盘输入两个有序字符串(不超过100个字符)
【输出形式】
输出合并后的有序字符串
【输入样例】
aceg
bdfh
【输出样例】
abcdefgh
【样例说明】
输入两个有序字符串aceg和bdfh,输出合并后的有序字符串abcdefgh
【运行结果如下】
【代码如下】
#include<stdio.h>
#define OK 1
#define ERROR -1
#define MAXSTRLEN 255 //用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度
typedef int Status;
/*赋值*/
Status StrAssign(SString &S)
{
int i = 0;
int k = 0;
int len = 0;
char ch[254];
gets(ch);
while (ch[i++] != '\0') len++; //获取ch的长度
i = 1;
if (len > MAXSTRLEN)
return ERROR; //串长度大于给定长度,发生截断
else
while (i <= len) S[i++] = ch[k++];
S[0] = len;
return OK;
}
/*输出串*/
Status outputStr(SString &S)
{
int i;
for(i=1; i<=S[0]; i++)
printf("%c",S[i]);
return OK;
}
/*将串中的元素进行升序排序*/
Status sortStr(SString &S)
{
int i, j;
char temp;
for (i = 1; i <= S[0]; i++)
for (j = 1; j <= S[0]-i; j++)
if (S[j] > S[j+1])
{
temp = S[j];
S[j] = S[j+1];
S[j+1] = temp;
}//if
return OK;
}
/*合并两个有序字符串*/
Status str_bin(SString &S1,SString &S2)
{
int i = 1;
int j = 1;
int k = 1;
SString T;
sortStr(S1); //对串进行排序
sortStr(S2);
while (i <= S1[0] && j <= S2[0])
{
if(S1[i] <= S2[j])
T[k++] = S1[i++];
else
T[k++] = S2[j++];
}//while
while (i <= S1[0]) T[k++] = S1[i++]; //将S1中剩余的字符归并到T中
while (j <= S2[0]) T[k++] = S2[j++]; //将S2中剩余的字符归并到T中
T[0] = S1[0] + S2[0];
outputStr(T); //输出串
return OK;
}
int main()
{
SString S1,S2;
StrAssign(S1);
StrAssign(S2);
str_bin(S1,S2); //合并
return 0;
}
本文章仅供学习和参考!
欢迎交流~