将链串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指针分别后移一个结点,算法如下:
完整代码如下:
//LinkString.cpp
效果如下:
删除串s=”helloabcabcWorld”, 得到”helloWorld”
//删除子串"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”
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- “百度与站长”更新:关于网站收录,删除,seo等
- 用vbs删除某些类型文件和磁盘空间报告的脚本
- QQ聊天记录删除了怎么恢复简单方法
- vbs删除注册表项的代码
- 迅速删除非法文件名的批处理代码
- C#中struct和class的区别详解
- 通过批处理实现删除运行、查找等处的历史记录的代码
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Shell中删除某些文件外所有文件的3个方法
- Lua教程(二):C++和Lua相互传递数据示例
- 删除文件提示文件正在被另一个人或程序使用的解决方法
- 关于.LDB文件 .ldb文件的产生 .ldb文件的删除方法
- asp 合并记录集并删除的sql语句
- SQLserver 数据库危险存储过程删除与恢复方法
- sql自增长设置与删除的深入分析