串(链式存储)

来源:互联网 发布:淘宝手机版新品上架 编辑:程序博客网 时间:2024/05/24 04:50

今天看书接触到了串,看到书本有关于串的很多操作,觉得有必要实现以下,下面的代码是实现将串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;

}

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

原创粉丝点击