您的位置:首页 > 编程语言 > C语言/C++

将链串s中的所有子串"abc"删除

2015-10-02 21:13 344 查看
  用p、q、r、t分别指向链串s的连续4个结点,p首先指向头结点。当q、r、t所指结点的值分别为’a’、’b’、’c’时,删除这3个结点并释放其空间,在后移q、r和t指针;否则p、q、r和t指针分别后移一个结点,算法如下:  

//删除子串"abc"
void delSub(LiString *&s){
int n=0;
LiString *p=s->next,*q,*r,*t;
while (p!=NULL) //求串s长度n
{
p=p->next; n++;
}
if(n<3) return;  //少于3个字符时返回
p=s; q=p->next; r=q->next; t=r->next;
while (q!=NULL && r!=NULL && t!=NULL)
{  //找到"abc"
if (q->data=='a' && r->data=='b' && t->data=='c')
{
p->next=t->next; //q、r、t分别指向后面的3个结点
free(q); free(r); free(t);
q=p->next;
if (q!=NULL)
{
r=q->next;
if(r!=NULL)
t=r->next;
}
}
else{
p=p->next;
q=p->next;
r=q->next;
t=r->next;
}
}

}


完整代码如下:

//LinkString.cpp

//LinkStringBase.h
#include <stdio.h>
#include <malloc.h>
typedef struct snode{ //链串定义
char data;
struct snode *next;
}LiString;

//创建串
void StrAssign(LiString *&s,char t[]){
int i;
LiString *r,*p;
s=(LiString *)malloc(sizeof(LiString));
s->next=NULL;
r=s;
for (i=0;t[i]!='\0';i++)
{
p=(LiString *)malloc(sizeof(LiString));
p->data=t[i];
p->next=NULL;
r->next=p; r=p;
}

}

//复制串
void StrCopy(LiString *&s,LiString *t){
LiString *p=t->next,*q,*r;
s=(LiString *)malloc(sizeof(LiString));
s->next=NULL; s->next=NULL; r=s;
while (p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}

}

//求两串是否相同
int StrEqual(LiString *s,LiString *t){
LiString *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 1;
else
return 0;

}

//求串的长度
int StrLength(LiString *s){
int i=0;
LiString *p=s->next;
while (p!=NULL)
{
i++;
p=p->next;
}
return i;

}

//比较两个字符串
LiString *Concat(LiString *s,LiString *t){
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
while (p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}
p=t->next;
while (p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}
return str;

}

//求串s中第i(1≤i≤n)的字符开始、长度为j的子串
LiString *SubStr(LiString *s,int i,int j){
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL; r=str;
if (i<=0 || i>StrLength(s) || j<0 || i+j-1 >StrLength(s))
{
printf("参数不正确\n");
return str;
}
for(k=0;k<i-1;k++)
p=p->next;
for (k=1;k<=j;k++)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}
return str;

}

//在串s的第i个位置插入将串t
LiString *InsStr(LiString *s,int i,LiString *t){
int k;
LiString *str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL; r=str;
if (i<=0 || i>StrLength(s)+1)
{
printf("参数不正确\n");
return str;
}
for (k=1;k<i;k++)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}
while (p1 != NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data; q->next=NULL;
r->next=q; r=q;
p1=p1->next;
}
while (p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;

}
return str;

}

//删除串s中第i(1≤i≤n)个位置,长度为j的子串
LiString *DelStr(LiString *s,int i,int j){
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL; r=str;
if (i<=0 || i>StrLength(s) || j<0 || i+j-1 >StrLength(s))
{
printf("参数不正确\n");
return str;
}
for (k=0;k<i-1;k++)
{
q=(LiString *)malloc(sizeof(LiString));
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 (p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}
return str;
}

//在链串s中,用串t替换 s中的第i个位置长度为j的子串
LiString *RepStr(LiString *s,int i,int j,LiString *t){
int k;
LiString *str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL; r=str;
if (i<=0 || i>StrLength(s) || j<0 || i+j-1 >StrLength(s))
{
printf("参数不正确\n");
return str;
}
for (k=0;k<i-1;k++)
{
q=(LiString *)malloc(sizeof(LiString));
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=(LiString *)malloc(sizeof(LiString));
q->data=p1->data; q->next=NULL;
r->next=q; r=q;
p1=p1->next;
}
while (p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data; q->next=NULL;
r->next=q; r=q;
p=p->next;
}
return str;

}

//输出串s
void DispStr(LiString *s){
LiString *p=s->next;
while (p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}

//主函数.cpp
#include <stdio.h>
#include "LinkStringBase.h"

//删除子串"abc" void delSub(LiString *&s){ int n=0; LiString *p=s->next,*q,*r,*t; while (p!=NULL) //求串s长度n { p=p->next; n++; } if(n<3) return; //少于3个字符时返回 p=s; q=p->next; r=q->next; t=r->next; while (q!=NULL && r!=NULL && t!=NULL) { //找到"abc" if (q->data=='a' && r->data=='b' && t->data=='c') { p->next=t->next; //q、r、t分别指向后面的3个结点 free(q); free(r); free(t); q=p->next; if (q!=NULL) { r=q->next; if(r!=NULL) t=r->next; } } else{ p=p->next; q=p->next; r=q->next; t=r->next; } } }

//判断s中字符是否递增
int isAscend(LiString *s){
LiString *p=s->next,*q;
if (p!=NULL)
{
while (p->next!=NULL)
{
q=p->next;
if(q->data>=p->data)
p=q;
else
return 0;
}
}
return 1;
}

void main(){
// LiString *Lstr=(LiString *)malloc(sizeof(LiString));
// Lstr->next=NULL;

LiString *Lstr2;

// char t[20]="helloworld";
char t2[20]="helloabcabcWorld";

// StrAssign(Lstr2,t);
// Lstr3=SubStr(Lstr2,1,3);
//
// DispStr(Lstr2);
// DispStr(Lstr3);

StrAssign(Lstr2,t2);

//原字符串
printf("原字符串 \n");
DispStr(Lstr2);
//操作后:
printf("操作后:\n");
delSub(Lstr2);
DispStr(Lstr2);

// int n=-2;
// n=isAscend(Lstr2);
// if (n==1)
// {
// printf("s为递增!\n");
// }
// else{
// printf("s非递增!\n");
// }

}


效果如下:



删除串s=”helloabcabcWorld”, 得到”helloWorld”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链串 struct 插入 删除 c++