串(链式存储)

今天看书接触到了串,看到书本有关于串的很多操作,觉得有必要实现以下,下面的代码是实现将串t插入到s串的第i个位置。做的过程中还是遇到一些问题,比如头结点,头结点是为了便于插入和删除算法的实现而存在的,头结点的next指针指向与开始结点。下面是所有代码:

 

// .cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

 

struct LiString

{

         char data;

         LiString *next;

};

 

int getLength(LiString * s)

{

         if(s == NULL)

         {

                   cout<<"非法操作"<<endl;

                   return NULL;

         }

         int i = 0;

         LiString * p = s->next;

         while(p != NULL)

         {

                   i++;

                   p = p->next;

         }

         return i;

}

 

LiString *InStr(LiString* s,int i ,LiString *t)

{

         if(i <= 0 || i > getLength(s))//位置不合法

         {

                   cout<<"非法操作"<<endl;

                   return NULL;

         }

         LiString*str,*p,*q,*r;

         str = new LiString;

         r = str;

         p = s->next;

         //采用尾插法

         for(int m = 0; m < i; m++)//复制s的前i-1个字符到str;

         {

                   q = new LiString;

                   q->data = p->data;

                   r->next = q;//尾指针的next指向p

                   r = q;//p成为尾结点

                   p = p->next;

         }

         LiString *p1 = t->next;//采用了头结点方式,从原节点的next开始复制数据

         while(p1 != NULL)//复制t的所有数据到str

         {

                   q = new LiString;

                   q->data = p1->data;

                   r->next = q;

                   r = q;

                   p1 = p1->next;

         }

        

         while( p != NULL)//复制s中的剩下数据

         {

                   q =  new LiString;

                   q->data = p->data;

                   r->next = q;

                   r = q;

                   p = p->next;

         }

 

         r->next = NULL;//尾插法切记不要忘记next指针指向NULL,否则会异常

         return str;

}

 

LiString * create()

{

         LiString *r,*s;

         s = new LiString;

         r = s;

         char data;

         for(int i = 0;i < 5; i++)

         {

                   switch (i)

                   {

                   case 0:data='a';break;

                   case 1:data='b';break;

                   case 2:data='c';break;

                   case 3:data='d';break;

                   case 4:data='e';break;

                   default:

                            break;

                   }

                   LiString *p = new LiString;

                   p->data = data;

                   r->next = p;

                   r = p;

         }

         r->next = NULL;

         return s;

}

 

void display(LiString * s)

{

         if(s == NULL)

         {

                   cout<<"非法操作!"<<endl;

                   return;

         }

         LiString *p = s->next;

         while(p != NULL)

         {

                   cout<<p->data;

                   p = p->next;

         }

         cout<<endl;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

         //cout<<"ddd"<<endl;

         LiString *s = create();

         LiString *b = create();

         //display(s);

         LiString *str = InStr(s,5,b);

         display(str);

         //cout<<getLength(s);

         return 0;

}

 如果您发现了错误或者不足,欢迎指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值