数据结构有关串的操作(C语言)
要求实现串的基本操作:
- 串的创建
- 输出串长
- 进行两个串的比较(如果是包含关系则比较串长,否则比较ASCALL码的值)
- 清空串
- 两个串的连接
- 求出某个串指定位置的子串
- 求出子串在指定串的位置
主要参考教科书上的伪代码进行修改了
但是运行过程中却有一些问题,让人无法理解
HString T1,T2,T3,Sub;
就是这个基本定义,原本我是在main函数里面定义的,但是总是运行之后出现了错误终止。
实现的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct {
char* ch;
int length;
}HString;
int StrAssign(HString& T, char* chars) {
char* c;
int i;
if (T.ch)
free(T.ch);
for (c = chars, i = 0; *c; ++c, ++i)
if (!i) {
T.ch = NULL;
T.length = 0;
c--;
}
else {
if (!(T.ch = (char*)malloc(i * sizeof(char))))
return 1;
for (int j = 0; j < i; j++)
T.ch[j] = chars[j];
T.length = i;
}
return 0;
}
int StrLength(HString T) {
return T.length;
}
int StrCompare(HString S, HString T) {
for (int i = 0; i < S.length && i < T.length; i++)
if (S.ch[i] != T.ch[i])return S.ch[i] - T.ch[i];
return S.length - T.length;
}
int StrClear(HString& T) {
if (T.ch) {
free(T.ch);
T.ch = NULL;
}
T.length = 0;
return 0;
}
int StrConcat(HString& T, HString S1, HString S2) {
if (T.ch)
free(T.ch);
if (!(T.ch = (char*)malloc((S1.length + S2.length) * sizeof(char))))
return 1;
T.length = S1.length + S2.length;
for (int i = 0; i < S1.length; i++)
T.ch[i] = S1.ch[i];
for (int i = 0; i < S2.length; i++)
T.ch[i + S1.length] = S2.ch[i];
return 0;
}
int SubString(HString& Sub, HString S, int pos, int len) {
if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)
return 1;
if (Sub.ch)
free(Sub.ch);
if (!len) {
Sub.ch = NULL;
Sub.length = 0;
}
else {
Sub.ch = (char*)malloc(len * sizeof(char));
for (int i = pos - 1, j = 0; j < len ; j++)
Sub.ch[j] = S.ch[i++];
Sub.length = len;
}
return 0;
}
int StrSelect(HString Sub, HString S) {
if (Sub.ch && S.ch && Sub.length > 0 && S.length > 0)
for (int i = 0; i < S.length; i++) {
HString s;
int temp;
if (S.ch[i] == Sub.ch[0])
{
SubString(s, S, i + 1, Sub.length);
temp = StrCompare(s, Sub);
if (temp == 0)
return i + 1;
}
}
return -1;
}
HString T1,T2,T3,Sub;
int main() {
char chars[11],charss[11];
int sign,n=1;
do {
printf("****************功能表*********************\n");
printf("** 1.创建串 2.输出串长 3.串的比较 **\n");
printf("** 4.清空串 5.连接串 6.求子串 **\n");
printf("** 7.子串位置 8.退出 **\n");
printf("*******************************************\n");
printf("请选择功能键进行操作:\n");
scanf("%d", &sign);
switch (sign)
{
case 1:
int temp;
printf("请选择创建串类型:\n(1.创建T1 2.创建T2 3.创建T1,T2)\n");
scanf("%d",&temp);
switch(temp){
case 1:
printf("请输入串T1:\n");
scanf("%s", chars);
StrAssign(T1,chars);
break;
case 2:
printf("请输入串T2:\n");
scanf("%s", charss);
StrAssign(T2, charss);
break;
case 3:
printf("请输入两个字符串:\n");
scanf("%s", chars);
StrAssign(T1,chars);
scanf("%s", charss);
StrAssign(T2, charss);
break;
}
break;
case 2:
printf("创建第一个字符串的长度:\n");
printf("%d\n", StrLength(T1));
printf("创建第二个字符串的长度:\n");
printf("%d\n", StrLength(T2));
break;
case 3:
if (StrCompare(T1, T2) == 0)
printf("两串相等\n");
else if (StrCompare(T1, T2) > 0)
printf("第一个串更大\n");
else if (StrCompare(T1, T2) < 0)
printf("第二个串更大\n");
break;
case 4:
StrClear(T1);
printf("串已清空\n");
printf("第一个串的长度变为%d\n", StrLength(T1));
break;
case 5:
StrConcat(T3,T1, T2);
printf("新串为%s\n", T3.ch);
break;
case 6:
SubString(Sub, T1, 3, 3);
printf("子串为\n%s\n", Sub.ch);
break;
case 7:
if(StrSelect(Sub,T2)==-1)
printf("子串不存在于T2中!\n");
else
printf("T1的子串在T2的位置:\n%d\n",StrSelect(Sub,T2));
break;
case 8:
n=0;
break;
default:
break;
}
} while (n==1);
return 0;
}
其运行结果如下
但是一但改变定义的位置,从局部变量变成全局变量就会导致运行结果改变
有能够解释的朋友还请不吝赐教,在下万分感激!
|