将一段字符串中首次出现的ab与xyz交换,用链串实现;
链串的基本操作:
#include<bits/stdc++.h>//此链串的节点大小均为1
#include<iostream>
using namespace std;
typedef struct snode
{
char data;
struct snode *next;
} LinkStrNode;
void StrAssing(LinkStrNode *&s,char cstr[])//生成一个cstr的链串,尾插法建立
{
int i;
LinkStrNode *r,*p;
s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
r=s;
for(i=0; cstr[i]!='\0'; i++)
{
p=(LinkStrNode *)malloc(sizeof(LinkStrNode));
p->data=cstr[i];
r->next=p;
r=p;
}
r->next=NULL;
}
void DestroyStr(LinkStrNode *&s)//销毁串
{
LinkStrNode *pre=s,*p=s->next;//pre指向p的前驱结点
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
void StrCopy(LinkStrNode *&s,LinkStrNode *t)//串的复制,将t复制到s
{
LinkStrNode *p=t->next,*q,*r;
s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
r=s;
while(p!=NULL)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
}
bool StrEqual(LinkStrNode *s,LinkStrNode *t)//判断两串是否相等
{
LinkStrNode *p=s->next,*q=t->next;
while(p!=NULL&&q!=NULL&&p->data==q->data)
{
p=p->next;
q=q->next;
}
if(p==NULL&&q==NULL)
return true;
else
return false;
}
int StrLength(LinkStrNode *s)//求串长
{
int i=0;
LinkStrNode *p=s->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
LinkStrNode *Concat(LinkStrNode *s,LinkStrNode *t)//串的链接,尾插法建立串的连接
{
LinkStrNode *str,*p=s->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
r=str;
while(p!=NULL)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
p=t->next;
while(p!=NULL)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LinkStrNode *SubStr(LinkStrNode *s,int i,int j)//求子串
{
int k;
LinkStrNode *str,*p=s->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<0||i>StrLength(s)||j<0||i+j-1>StrLength(s))
return str;//参数不正确,返回空串
for(k=1; k<i; k++)
p=p->next;
for(k=1; k<=j; k++)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LinkStrNode *DelStr(LinkStrNode *s,int i,int j)
{
int k;
LinkStrNode *str,*p=s->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
return str;
for(k=1; k<i; k++)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
for(k=0; k<j; k++)
p=p->next;
while(p!=NULL)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LinkStrNode *InsStr(LinkStrNode *s,int i,LinkStrNode *t)
{
int k;
LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0||i>=StrLength(s)+1)
return str;
for(k=1; k<i; k++)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
while(p1!=NULL)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
while(p!=NULL)
{
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LinkStrNode *RepStr(LinkStrNode *s,int i,int j,LinkStrNode *t)
{
int k;
LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
str=(LinkStrNode*)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
return str;
for(k=0; k<i-1; k++)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
for(k=0; k<j; k++)
p=p->next;
while(p1!=NULL)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p1->data;
q->next=NULL;
r->next=q;
r=q;
p1=p1->next;
}
while(p!=NULL)
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
void DispStr(LinkStrNode *s)
{
LinkStrNode *p=s->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
主函数具体实现:
#include"Listring.cpp"
void Repl(LinkStrNode *&s)
{
LinkStrNode *p=s->next,*q;
bool find=false;
while(p!=NULL&&p->next!=NULL&&!find)
{
if(p->data=='a'&&p->next->data=='b')
{
p->data='x';
p->next->data='z';
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data='y';
q->next=p->next;
p->next=q;
find=true;
}
else p=p->next;
}
}
int main()
{
LinkStrNode *s;
s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
char a[1000];
cout<<"(将第一次出现的ab交换成xyz)请输入至少包含一个ab的字符串:";
cin>>a;
StrAssing(s,a);
cout<<"交换前:";DispStr(s);
Repl(s);
cout<<"交换后:";DispStr(s);
return 0;
}