串的堆分配存储表示
由于堆分配存储结构的串既有顺序存储结构的特点,处理方便,操作中对串长又没有任何限制,更显灵活。
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char *ch;
int len;
}HString;
int Concat(HString *t, HString *s1, HString *s2);
int SubString(HString *sub, HString *s, int pos, int len);
void print_hyphen(int n);
int main(void)
{
int i,j,k;
int len;
HString HS1, HS2, HS3;
printf("请输入为字符串分配的空间大小: ");
scanf("%d", &len);
getchar();
printf("请输入字符串:");
HS1.ch = (char*)malloc(len*sizeof(char));
i = 0, j = 0;
while(1){
if(scanf("%c", &HS1.ch[i]) == EOF || HS1.ch[i] == '\n')
break;
i++;
j++;
}
HS1.len = j;
int end = 0;
int ope;
int n;
while(!end){
print_hyphen(15); printf("\n");
printf("请输入指令来执行操作\n");
print_hyphen(15); printf("\n");
printf("1、求子串\n2、串连接\n3、退出\n");
print_hyphen(15); printf("\n");
printf("输入要使用的功能的序号: ");
scanf("%d", &ope);
switch(ope){
case 1:
printf("请输入子串的起始位置: ");
int pos, len;
scanf("%d", &pos);
printf("请输入子串的长度: ");
scanf("%d", &len);
if(SubString(&HS3, &HS1, pos, len)){
printf("子串为:\n");
for(i = 0; i < HS3.len; i++)
printf("%c", HS3.ch[i]);
printf("\n");
}
else
printf("输入的数据不合法!\n");
break;
case 2:
printf("请输入为另一个字符串分配的空间大小: ");
scanf("%d", &len);
getchar();
printf("请输入字符串:");
HS2.ch = (char*)malloc(len*sizeof(char));
i = 0, j = 0;
while(1){
if(scanf("%c", &HS2.ch[i]) == EOF || HS2.ch[i] == '\n')
break;
i++;
j++;
}
HS2.len = j;
if(Concat(&HS3, &HS1, &HS2)){
printf("串连接成功!\n");
printf("连接后的串为: \n");
for(i = 0; i < HS3.len; i++)
printf("%c", HS3.ch[i]);
printf("\n");
}
else
printf("串连接失败!\n");
break;
case 3:
printf("再见!\n");
end = 1;
break;
default:
printf("无此序号,请重新输入!\n");
}
}
return 0;
}
int Concat(HString *t, HString *s1, HString *s2)
{
int i;
if(t->ch)
free(t->ch);
if(!(t->ch = (char*)malloc((s1->len+s2->len)*sizeof(char))))
return 0;
for(i = 0; i < s1->len; i++)
t->ch[i] = s1->ch[i];
for(i = 0; i < s2->len; i++)
t->ch[i+s1->len] = s2->ch[i];
t->len = s1->len + s2->len;
return 1;
}
int SubString(HString *sub, HString *s, int pos, int len)
{
int i;
if(pos < 1 || pos > s->len || len < 0 || len > s->len-pos+1)
return 0;
if(sub->ch)
free(sub->ch);
if(!len){
sub->ch = NULL;
sub->len = 0;
}
else{
sub->ch = (char*)malloc(len*sizeof(char));
for(i = 0; i < len; i++)
sub->ch[i] = s->ch[i+pos-1];
sub->len = len;
}
return 1;
}
void print_hyphen(int n)
{
while(n--)
printf("-");
}