#include "malloc.h"
using namespace std;
#define MaxSize 100
typedef struct node{
char data;
struct node *next;
}LinkString;
void Assign(LinkString *&s,char str[]){
int i=0;
LinkString *p,*tc;
s=(LinkString*)malloc(sizeof(LinkString));
tc=s;
while(str[i]!='\0'){
p=(LinkString*)malloc(sizeof(LinkString));
p->data=str[i];
tc->next=p;tc=p;
i++;
}
tc->next=NULL;
}
void Destroystr(LinkString *&s){
LinkString *pre=s,*p=pre->next;
while(p){
free(pre);
pre=p;p=p->next;
}
free(pre);
}
void StrCopy(LinkString *&s,LinkString *t){
LinkString *p=t->next,*q,*tc;
s=(LinkString*)malloc(sizeof(LinkString));
tc=s;
while(p){
q=(LinkString*)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
tc->next=NULL;
}
int StrLength(LinkString *s){
int n=0;
LinkString *p=s->next;
while(p){
n++;
p=p->next;
}
return n;
}
int StrEqual(LinkString *s,LinkString *t){
LinkString *p=s->next,*q=t->next;
while(p&&q){
if(p->data!=q->data){
return 0;
}
p=p->next;
q=q->next;
}
if(p||q){
return 0;
}else return 1;
}
LinkString* Concat(LinkString* s,LinkString* t){
LinkString* p=s->next,*q,*tc,*r;
r=(LinkString*)malloc(sizeof(LinkString));
tc=r;
while(p){
q=(LinkString*)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
p=t->next;
while(p){
q=(LinkString*)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
tc->next=NULL;
return r;
}
LinkString* SubStr(LinkString* s,int i,int j){
LinkString *r,*p=s->next,*q,*tc;
int k=1;
r=(LinkString*)malloc(sizeof(LinkString));
r->next=NULL;
if(i<1){
return r;
}
tc=r;
while(k<i&&p){
p=p->next;
k++;
}
if(p==NULL){
return r;
}
k=1;q=p;
while(k<j&&q){
q=q->next;
k++;
}
if(!q){
return r;
}
k=1;
while(k<=j&&p){
q=(LinkString*)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
k++;
}
tc->next=NULL;
return r;
}
int Index(LinkString* s,LinkString* t){
LinkString *p=s->next,*q,*q1,*p1;
int i=1;
while(p){
q=t->next;
if(p->data==q->data){
p1=p->next;
q1=q->next;
while(p1&&q1&&p1->data==q1->data){
p1=p1->next;
q1=q1->next;
}
if(!q1){
return i;
}
}
p=p->next;i++;
}
return 0;
}
int InsStr(LinkString *&s,int i,LinkString *t){
int k=1;
LinkString *p=s,*q,*r;
if(i<1){
return 0;
}
while(k<i&&p){
k++;p=p->next;
}
if(!p) return 0;
q=t->next;
while(q){
r=(LinkString*)malloc(sizeof(LinkString));
r->data=q->data;
r->data=p->data;
p->next=r;
p=p->next;
q=q->next;
}
return 1;
}
int DelStr(LinkString *&s,int i,int j){
LinkString *p=s,*q;
int k;
if(i<1||j<1){
return 0;
}
while(k<i&&p!=NULL){
p=p->next;k++;
}
if(!p){return 0;
}
k=1;
q=p->next;
while(k<j&&q){
q=q->next;k++;
}
if(!q){
return 0;
}k=1;
while(k<=j){
q=p->next;
if(q->next==NULL){
free(q);
p->next=NULL;
}else{
p->next=q->next;
free(q);
}
k++;
}
return 1;
}
LinkString* RepStrAll(LinkString *s,LinkString *s1,LinkString *s2){
int i;
i=Index(s,s1);
while(i>0){
DelStr(s,i,StrLength(s1));
InsStr(s,i,s2);
i=Index(s,s1);
}
return s;
}
void DispStr(LinkString *s){
LinkString *p=s->next;
while(p){
cout<<p->data;
p=p->next;
}
cout<"\n";
}
以上是头文件
#include <iostream>
#include "LinkString.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
LinkString *s1,*s2,*s3,*s4,*s5,*s6;
Assign(s1,"abcdefghijk");
cout<<"s1";DispStr(s1);
cout<<StrLength(s1)<<"\n";
StrCopy(s2,s1);
cout<<"s2";
DispStr(s2);
cout << StrEqual(s1,s2);
Concat(s1,s2);
DispStr(s1);cout<<"\n";
SubStr(s1,2,3);
DispStr(s1);cout<<"\n";
Index(s1,s2);
DispStr(s1);cout<<"\n";
InsStr(s1,1,s2);
DispStr(s1);cout<<"\n";
DelStr(s1,1,2);
DispStr(s1);cout<<"\n";
RepStrAll(s1,s2,s3);
DispStr(s1);cout<<"\n";
return 0;
}