例题4.3

将一段字符串中首次出现的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;
}

运行实现的框框

猜你喜欢

转载自blog.csdn.net/JXiang_IT/article/details/80486968
4.3