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

52 篇文章 2 订阅

  用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”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值