数据结构用C语言写的串怎么写主函数

2025-03-04 17:49:57
推荐回答(2个)
回答1:

/*

串a:

abcdefghijklmnopqrstuvwxyz

串b:

01234567890123456789

串a:

abcdefghijklmnopqrstuv012345678901234567

串c:

abcdefghijklmnopqrstuvwxyz

Press any key to continue

*/

#include 
#define MAXLEN 40

typedef struct {
char ch[MAXLEN];
int len;
}SString;

void StrInsert(SString *s,int pos,SString t) {
int i;
if(pos < 0 ) pos = 0;
if(pos > s->len - 1) pos = s->len;
if(s->len + t.len <= MAXLEN) { // 长度适中
for(i = s->len + t.len - 1;i > pos;i--)
s->ch[i] = s->ch[i - t.len];
for(i = 0;i < t.len;i++) s->ch[i + pos] = t.ch[i];
s->len += t.len;
}
else if(pos + t.len > MAXLEN) { // 长度超限1,从pos后不再有s的内容
for(i = pos;i < MAXLEN; ++i)
s->ch[i] = t.ch[i - pos];
s->len = MAXLEN;
}
else { // 长度超限2,从pos + t.len后还有s的部分内容
for(i = MAXLEN - 1; i >= pos + t.len; --i)
s->ch[i] = s->ch[i - t.len];
for(i = 0; i < t.len; ++i)
s->ch[i + pos] = t.ch[i];
s->len = MAXLEN;
}
}

// 在s中从pos位置开始删除len个字符
int StrDelete(SString *s,int pos,int len) {
int i;
if(pos < 0 || pos > s->len) return 0;
if(pos + len < s->len) { // 删除s的中间部分
for(i = pos;i < pos + len;i++)
s->ch[i] = s->ch[i + len];
s->len -= len;
}
else { // len太大
s->len = pos;
}
return 1;
}

SString StrCopy(SString *s,SString t) {
int i;
for(i = 0;i < t.len;i++) s->ch[i] = t.ch[i];
s->len = t.len;
return *s;
}

int StrEmpty(SString s) {
if(s.len == 0) return 1;
return 0;
}

int SteCompare(SString s,SString t) {
int i;
for(i = 0;i < s.len && i < t.len;i++)
if(s.ch[i] != t.ch[i]) return (s.ch[i] - t.ch[i]);
return (s.len - t.len);
}

int SteLength(SString s) {
return s.len;
}

void StrClear(SString s) {
s.len = 0;
}

void StrShow(const SString s) {
int i;
for(i = 0; i < s.len; ++i)
printf("%c",s.ch[i]);
printf("\n");
}

int main() {
SString stra = {"abcdefghijklmnopqrstuvwxyz",26};
SString strb = {"01234567890123456789",20},strc;
StrCopy(&strc,stra);
printf("串a:\n");
StrShow(stra);
printf("串b:\n");
StrShow(strb);
StrInsert(&stra,22,strb); //
printf("串a:\n");
StrShow(stra);
printf("串c:\n");
StrShow(strc);
return 0;
}

回答2:

if(pos<0 ||)pos>(s->len-len))return(0);//多了个括号
for(i=->len+t.len-1;i>=t.len+pos;i--)//for(i=s->len+t.len....
StrEmpty(SString s)
{
if(s.len==0)return(1);
s->len=t.len;
}//t哪来的,应该会报错,我默认你把函数的类型都省略。这个行数要执行的功能应该和strclean是一样的吧,没什么必要写。
代码很好但是不是您老写的,怀疑,东平西凑的把,SteCompare和SteLength,这里正常来建会是StrCompare和StrLength
回答正题main()函数,假设代码真确,去掉StrEmpty函数,我不知道这个函数你到底要做什么。
void main(){
SString s1,s2;int a;
pringf("先输入字符串,再输入要在哪个位置插入,最后输入插入字符\n");
gets(s1.ch);scanf("%d",&a);getchar();gets(s2.ch);
if(StrInsert(s1,a,s2)) printf("inset OK\n");else 省略,可以不要;
......按照这样把其他函数都用一遍,省略,StrClear要最后用。

最后的感想:写出这样代码的人竟然不会写主函数,是我没理解你的问题吗?