题目描述
写一个函数将顺序串s1中的第i个字符到第j个字符之间的字符用s2串替换
思路分析:
类比插入,在插入函数中,要留出位置插入要插入的字符串,所以要保留原位置的数据,而对于替换,只需要插入,不用管原先的位置即可。
然而有很多情况,这里考虑情况较少,下面附C++与C代码不同语言编写,同时一个使用链串一个使用顺序串,以此巩固学习。
C++代码,建立LinkString Class,其中用到运算符重载,作用是赋字符串。
#include <iostream>
#define MAXSIZE 100
using namespace std;
struct LinkNode{
char data;
LinkNode *next;
};
class LinkStringClass{
LinkNode *head;
public:
LinkStringClass();
~LinkStringClass();
int StrLength();
LinkStringClass &operator=(char *cstr);
LinkStringClass &RepStr(int i,int j,LinkStringClass &s);
void CreatStr();
void DispStr();
};
LinkStringClass::LinkStringClass(){
head=new LinkNode();
head->next=NULL;
}
LinkStringClass::~LinkStringClass(){
LinkNode *pre,*p;
pre=head;
p=pre->next;
}
int LinkStringClass::StrLength(){
int i=0;
LinkNode *p=head->next;
while(p!=NULL){
i++;
p=p->next;
}
return i;
}
LinkStringClass &LinkStringClass::operator=(char cstr[]){
int i;
LinkNode *r=head,*p;
for(i=0;i<cstr[i]!='\0';i++){
p=new LinkNode();
p->data=cstr[i];
r->next=p;
r=p;
}
r->next=NULL;
return *this;
}
LinkStringClass &LinkStringClass::RepStr(int i,int j,LinkStringClass &s){
static LinkStringClass nstr;
int k;
LinkNode *p=head->next,*p1=s.head->next,*q,*r;
r=nstr.head;
if(i<0||i>StrLength()||j<0||i+j-1>StrLength()) return nstr;
for(k=0;k<i-1;k++){
q=new LinkNode();
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
for(k=0;k<j;k++) p=p->next;
while(p1!=NULL){
q=new LinkNode();
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
while(p!=NULL){
q=new LinkNode();
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return nstr;
}
void LinkStringClass::DispStr(){
LinkNode *p=head->next;
while(p!=NULL){
cout<<p->data;
p=p->next;
}
cout<<endl;
}
int main(){
while(1){
char s1[MAXSIZE],s2[MAXSIZE];
cout<<"Input string1:";
cin>>s1;
cout<<"Input string2:";
cin>>s2;
cout<<"Input i and j:";
int i,j,temp;
cin>>i>>j;
LinkStringClass t1,t2,m;
t1=s1;t2=s2;
m=t1.RepStr(i,j,t2);
m.DispStr();
cout<<"0.continue 1.break:";
cin>>temp;
if(temp) break;
}
return 0;
}
C代码,建立结构体,顺序串编译。
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct{
char ch[MAXSIZE];
int len;
}SString;
int StrRepalce(SString *s,int posi,int posj,SString t);
int StrInit(SString *s);
int StrLength(SString s);
int StrCreat(SString *s);
int main(){
SString s1,s2;
int i,j,temp;
while(1){
StrCreat(&s1);
StrCreat(&s2);
printf("Input i and j:\n");
scanf("%d%d",&i,&j);
StrRepalce(&s1,i-1,j-1,s2);
printf("0.Continue 1.break:");
scanf("%d",&temp);
if(temp) break;
}
return 0;
}
int StrInit(SString *s){
s->len=0;
return 1;
}
int StrLength(SString s){
return s.len;
}
int StrCreat(SString *s){
StrInit(s);
printf("Input string:");
scanf("%s",s->ch);
s->len=strlen(s->ch);
return 1;
}
int StrRepalce(SString *s,int posi,int posj,SString t){
int i;
if(posi>=posj||posi<0||s->len>MAXSIZE||posi>s->len||posj-posi+1>t.len) return 0;
for(i=posi;i<=posj;i++){
s->ch[i]=t.ch[i-posi];
}
puts(s->ch);
return 1;
}