#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct snode
{
char data;
struct snode * next;
}LiString;
void StrAssign(LiString *&s,char t[])
{
int i;
LiString *r,*p; /*r始终指向尾结点*/
s=(LiString *)malloc(sizeof(LiString));
r=s;
for (i=0;t[i]!='\0';i++)
{
p=(LiString *)malloc(sizeof(LiString));
p->data=t[i];
r->next=p;
r=p;
}
r->next=NULL;
}
void StrCopy(LiString *&s,LiString *t)
{
LiString *p=t->next,*q,*r;
s=(LiString *)malloc(sizeof(LiString));
r=s; /*r始终指向尾结点*/
while (p!=NULL) /*将t的所有结点复制到s*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
}
int StrEqual(LiString *s,LiString *t)
{
LiString *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 1;
else
return 0;
}
int StrLength(LiString *s)
{
int i=0;
LiString *p=s->next;
while (p!=NULL)
{
i++;
p=p->next;
}
return i;
}
LiString *Concat(LiString *s,LiString *t)
{
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
r=str;
while (p!=NULL) /*将s的所有结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
p=t->next;
while (p!=NULL) /*将t的所有结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LiString *SubStr(LiString *s,int i,int j)
{
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
r=str;
if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
{
printf("参数不正确\n");
return str; /*参数不正确时返回空串*/
}
for (k=0;k<i-1;k++) /*找第i-1个结点,由p指向它*/
p=p->next;
for (k=1;k<=j;k++) /*s[i]开始的j个结点=>str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LiString *InsStr(LiString *s,int i,LiString *t)
{
int k;
LiString *str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
r=str;
if (i<=0 || i>StrLength(s)+1)
{
printf("参数不正确\n");
return str; /*参数不正确时返回空串*/
}
for (k=1;k<i;k++) /*将s的前i个结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
while (p1!=NULL) /*将t的所有结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;q->next=NULL;
r->next=q;r=q; p1=p1->next;
}
while (p!=NULL) /*将*p及其后的结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;r=q; p=p->next;
}
r->next=NULL; //q用来申请结点,p遍历s1,q遍历s2
return str;
}
LiString *DelStr(LiString *s,int i,int j)
{
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
r=str;
if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
{
printf("参数不正确\n");
return str; /*参数不正确时返回空串*/
}
for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
for (k=0;k<j;k++) /*让p沿next跳j个结点*/
p=p->next;
while (p!=NULL) /*将*p及其后的结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LiString *RepStr(LiString *s,int i,int j,LiString *t)
{
int k;
LiString *str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
r=str;
if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
{
printf("参数不正确\n");
return str; /*参数不正确时返回空串*/
}
for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
for (k=0;k<j;k++) /*让p沿next跳j个结点*/
p=p->next;
while (p1!=NULL) /*将t的所有结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;q->next=NULL;
r->next=q;r=q;p1=p1->next;
}
while (p!=NULL) /*将*p及其后的结点复制到str*/
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
void DispStr(LiString *s)
{
LiString *p=s->next;
while (p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LiString *s,*s1,*s2,*s3,*s4;
printf("建立串S和S1...\n");
StrAssign(s,"abcdefghijklmn");
StrAssign(s1,"xyz");
Sleep(2000);
printf("输出串S:");
DispStr(s);
Sleep(2000);
int length = StrLength(s);
printf("输出串S的长度:%d",length);
printf("\n");
Sleep(2000);
s2 = InsStr(s,9,s1);
printf("在串S的第9个字符位置插入串S1而生成串S2...\n");
Sleep(2000);
printf("输出串S2:");
DispStr(s2);
Sleep(2000);
s2 = DelStr(s,2,5);
printf("删除串S的第2个字符开始的5个字符而生成串S2...\n");
Sleep(2000);
printf("输出串S2:");
DispStr(s2);
Sleep(2000);
s2 = RepStr(s,2,5,s1);
printf("将串S的第2个字符开始的5个字符替换成串S1而生成串S2...\n");
Sleep(2000);
printf("输出串S2:");
DispStr(s2);
Sleep(2000);
s3 = SubStr(s,2,10);
printf("提取串S的第2个字符开始的10个字符而生成串S3...\n");
Sleep(2000);
printf("输出串S3:");
DispStr(s3);
Sleep(2000);
s4 = Concat(s1,s2);
printf("将串S1和S2连接起来生成串S4...\n");
Sleep(2000);
printf("输出串S4:");
DispStr(s4);
Sleep(2000);
return 0;
}