一、一个小插曲
在写这篇文章之前,作者想先和大家分享一个小故事。如果你不想看这个小故事的话,可以直接跳到第二点哦。
为了锻炼自己的编码能力,平时作业和实验题的代码我都是不看书、不看老师的PPT,按照自己的思路一行一行敲出来的。同时也不太理解那些照着书敲代码的同学。直到有一天,我看见我的数据结构作业字符串大小比较的函数被打上了一把大大的红叉,我一开始很不理解:我的代码在编译器上成功运行了,没问题呀!一定是老师改错了。
我当初写的代码是这样的,思路是:先比较串长,字符串越长越大。若串长一致,再依次比较各个字符的ASCII码,ASCII码大的串越大。所以写出来的函数是这样的。
Status StringCompare1(String* S, String* T)//返回值为1,表示S>T;返回值为0,代表S=T;返回值为-1,代表S<T
{
if (S->len > T->len)//串长S>T
return 1;
else if (S->len < T->len)//串长S<T
return -1;
else//若串长一致,则分别比较相应字符的ASCII
{
for (int i = 0; i < S->len; i++)
{
if (S->data[i] > T->data[i])
return 1;
else if (S->data[i] < T->data[i])
return -1;
}
return 0;//若循环跳出,则说明两个字符串完全相同
}
}
又过了好几个星期(也就是今天),我打算写一篇字符串大小比较的函数,因为是要发出来给大家看的,所以我必须保证内容的正确性,于是我在CSDN上搜了几篇关于字符串大小比较的博客,才发现我当初是错得多么离谱。
也是近段时间才明白:不能太忽视书本和教学PPT,要先熟悉掌握经典的算法思路,再去自己敲代码,否则,完全凭自己的思路,算法往往不是最优的,甚至有可能是错的。像这样的坑,其实我已经跳了不止一次,今天分享的这个故事只是其中的一个。以后要好好改进这点了,先把基础打牢,再去“发明创造”。
二、算法思路及代码
字符串的大小是从最左边第一个字符开始比较,大者为大,小者为小,若相等,则继续比较后面的字符。
话不多说上代码:
首先是头文件、宏定义及结构体等
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define ERROR 0
#define OK 1
#define MAX_SIZE 21//多留出一位储存'\n'
typedef struct String {
char* data;
int len;
};
其次是串的大小比较函数
Status StringCompare(String* S, String* T)//返回值为1,表示S>T;返回值为0,代表S=T;返回值为-1,代表S<T
{
for (int i = 0; S->data[i] && T->data[i]; i++)
{
if (S->data[i] > T->data[i])//分别比较对应字符的ASCII
return 1;
else if(S->data[i] < T->data[i])//分别比较对应字符的ASCII
return -1;
}
return 0;//若循环跳出,说明两个字符串大小相等
}
为了测试函数的正确性,我们需要再定义串的初始化函数、输入函数以及主函数。
串的初始化函数
void InitString(String* s)//初始化
{
s->data = (char*)malloc(sizeof(char)*MAX_SIZE);
s->len = 0;
}
串的输入函数
Status Input(String* s)//添加元素
{
int n;
printf("输入需要加入的元素个数:");
scanf("%d", &n);//输入需要加入的元素个数
getchar();//吸收上一次输入的'\n'
printf("输入字符串:");
for (int i = s->len; i <= n; i++)//i<=n因为最后还要输入'\n'代表输入完成
{
s->data[i] = getchar();
s->len++;
if (s->len == MAX_SIZE-1)//每一次输入后,判断串是否已满(因为结尾有'\n',所以MAX_SIZE-1就认为数组已满)
return ERROR;
}
s->len--;//除去结尾的'\n'
return OK;
}
主函数
int main()
{
String* S = (String*)malloc(sizeof(String));
InitString(S);//初始化
Input(S);
String* T = (String*)malloc(sizeof(String));
InitString(T);//初始化
Input(T);
if (StringCompare(S, T) == 1)
printf("S>T");
else if (StringCompare(S, T) == 0)
printf("S=T");
else
printf("S<T");
return 0;
}
所有代码放一起运行,就能得到最终的运行结果了,这里放一个运行示例,其他的你们自己去试吧。
运行结果