链串的基本算法


```cpp

```cpp
#include<iostream>
#include<stdio.h>
using namespace std;
    typedef class bunch
        {
            public:
                char a;
                bunch *next;
        }*LinkBunch,Link;
     void creat_LinkBunch(LinkBunch &L,char t[]);
     void strcopy(LinkBunch &L1,LinkBunch L2); //将L2复制到L1,使用尾插法
     int StrLength(LinkBunch &L);
     LinkBunch Conact(LinkBunch &L1,LinkBunch &L2);//串连接的方法L2连接到L1后面
     LinkBunch SubStr(LinkBunch &L,int i,int j); //求从i个开始连续j个的字符子串
     LinkBunch InsStr(LinkBunch &L1,int i,LinkBunch &L2);//将L2插入到L1中第i个元素的位置
     LinkBunch DelStr(LinkBunch &L1,int i,int j);//删除 第i个开始连续j个子字符串
     void printlist(LinkBunch &L);
    int main()
        {
            int i,j;
            LinkBunch L1,L2;
            char a[30];
            gets(a);
            creat_LinkBunch(L1,a);
            printlist(L1);
            cout<<"第几个位置开始"<<endl;
            cin>>i;
            cout<<"连续几个"<<endl;
            cin>>j;
            LinkBunch L=DelStr(L1,i,j);
            printlist(L);
            /*gets(a);
            creat_LinkBunch(L2,a);
            printlist(L2);
            cout<<"你想插在第几个位置"<<endl;
            cin>>i;
            LinkBunch L=InsStr(L1,i,L2);
            printlist(L);

            /*strcopy(L2,L1);
            printlist(L2);
            LinkBunch L=Conact(L1,L2);
            printlist(L);
            cout<<"从几个开始"<<endl;
            cin>>i;
            cout<<"到几个结束"<<endl;
            cin>>j;
            L=SubStr(L,i,j);
            printlist(L);*/

            return 0;
        }

    void creat_LinkBunch(LinkBunch &L,char t[])//ok
        {
            L=new Link;
            L->next=NULL;
            LinkBunch s,rear;
            rear=L;
            int i=0;
            while(t[i]!='\0')
            {
                s=new Link;
                s->a=t[i];
                s->next=rear->next;
                rear->next=s;
                rear=s;
                i++;
            }
            rear->next=NULL;
        }

    void strcopy(LinkBunch &L1,LinkBunch L2) //将L2复制到L1,使用尾插法//ok
        {
                L1=new Link;
                L1->next=NULL;
                LinkBunch s,rear,p;
                rear=L1;
                p=L2->next;
                while(p!=NULL)
                {
                    s=new Link;
                    s->a=p->a;
                    s->next=rear->next;
                    rear->next=s;
                    rear=s;
                    p=p->next;
                }
                rear->next=NULL;
        }

    int StrLength(LinkBunch &L)
        {
            LinkBunch p=L->next;
            int i=0;
            while(p!=NULL)
            {
                i++;
                p=p->next;
            }
            return i;
        }

    LinkBunch Conact(LinkBunch &L1,LinkBunch &L2)//串连接的方法L2连接到L1后面//ok
        {
            LinkBunch L=new Link;
            L->next=NULL;
            LinkBunch s,rear=L;
            LinkBunch p=L1->next;
            while(p!=NULL)
            {
                s=new Link;
                s->a=p->a;
                s->next=rear->next;
                rear->next=s;
                rear=s;
                p=p->next;
            }
            rear->next=NULL;
            p=L2->next;
            while(p!=NULL)
            {
                s=new Link;
                s->a=p->a;
                s->next=rear->next;
                rear->next=s;
                rear=s;
                p=p->next;
            }

            return L;
        }


        LinkBunch SubStr(LinkBunch &L,int i,int j) //求从i个开始连续j个的字符子串//ok
            {
                LinkBunch q=new Link;
                LinkBunch s,rear;
                q->next=NULL;
                rear=q;
                LinkBunch p=L->next;
                if(i>StrLength(L)||i<1||j<1||i+j>StrLength(L)+1)
                {
                    return q;
                }
                int k=1;
                while(k<=i-1)
                {
                    p=p->next;
                    k++;
                }
                while(j>=1)
                {
                    s=new Link;
                    s->a=p->a;
                    s->next=rear->next;
                    rear->next=s;
                    rear=s;
                    p=p->next;
                    j--;
                }
                return  q;

            }

        LinkBunch InsStr(LinkBunch &L1,int i,LinkBunch &L2)//将L2插入到L1中第i个元素的位置//ok
            {
                LinkBunch L=new Link;
                L->next=NULL;
                if(i<0||i>StrLength(L1)+1)
                {
                    return L;
                }
                LinkBunch p=L1->next,q=L2->next;
                LinkBunch s,rear=L;
                int k=1;
                while(k<i)
                {
                    s=new Link;
                    s->a=p->a;
                    s->next=rear->next;
                    rear->next=s;
                    rear=s;
                    p=p->next;
                    k++;
                }
                while(q!=NULL)
                {
                    s=new Link;
                    s->a=q->a;
                    s->next=rear->next;
                    rear->next=s;
                    rear=s;
                    q=q->next;
                }

                while(p!=NULL)
                {
                    s=new Link;
                    s->a=p->a;
                    s->next=rear->next;
                    rear->next=s;
                    rear=s;
                    p=p->next;
                }

                return L;
            }


            LinkBunch DelStr(LinkBunch &L1,int i,int j)//删除 第i个开始连续j个子字符串
                {
                    LinkBunch L=new Link;
                    L->next=NULL;
                    LinkBunch rear;
                    rear=L;
                    LinkBunch s;
                    LinkBunch p=L1->next;
                    if(i<1||i>StrLength(L1)||i+j-1>StrLength(L1)||j<1)
                        {
                            return L;
                        }
                    int k=1;
                    while(k<i)

                    {
                        s=new Link;
                        s->a=p->a;
                        s->next=rear->next;
                        rear->next=s;
                        rear=s;
                        p=p->next;
                        k++;
                    }
                   k=1;
                   while(k<=j)
                   {
                       p=p->next;
                       k++;
                   }
                   while(p!=NULL)
                   {
                       s=new Link;
                       s->a=p->a;
                       s->next=rear->next;
                       rear->next=s;
                       rear=s;
                       p=p->next;
                   }
                   return L;

                }

            void printlist(LinkBunch &L)
                {
                    LinkBunch p=L->next;
                    if(p==NULL)
                    {
                        return ;
                    }
                    else
                    {
                        while(p!=NULL)
                        {
                            cout<<p->a;
                            p=p->next;
                        }
                    }

                    cout<<endl;
                }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值