今天看书接触到了串,看到书本有关于串的很多操作,觉得有必要实现以下,下面的代码是实现将串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;
}
如果您发现了错误或者不足,欢迎指出。