数据结构预算法。链式串基本操作示例

这篇博客展示了如何使用链式串进行一系列基本操作,包括初始化、显示、比较、连接、子串提取、索引查找、插入、删除以及替换等。通过C++代码实例,深入理解数据结构中的链式串概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "iostream"
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值