“ Ctrl AC!一起 AC!”
目录
字符串的链式存储称为链式串
结点的定义:
typedef struct node{
char data;
struct node *next;
}linkstrnode;
typedef linkstrnode *linkstring;
创建字符串:
void strcreate(linkstring *S){
char ch;
linkstrnode *p,*r; //临时结点,最后一个结点
*S=NULL; r=NULL;
while((ch=getchar())!='\n'){
p=(linkstrnode*)malloc(sizeof(linkstrnode));
p->data=ch;
if(*S=NULL) *S=p;
else r->next=p;
r=p;
}
if(r!=NULL) r->next=NULL;
}
插入:
void strinsert(linkstring *S,int i,linkstring T){ //将T插到S从位置i开始的地方
int k;
linkstring p,q;
p=*S,k=1;
while(p&&k<i-1){
p=p->next;
k++;
} //此后 p 指向S内的第i-1个元素
if(!p) printf("error\n");
else{
q=T;
while(q&&q->next) q=q->next; //找T的最后一个位置
q->next=p->next;
p->next=T;
}
}
删除:
操作:删除字符串S从位置i开始的长度为len的子串。
定义p,q,在p从头扫到第i个位置的过程中,q始终跟踪为p的前驱,当p指向第i个位置时,q就指向第i-1个位置。然后保持q不变,继续将p往后移动len个单位(也就是移动待删除字符串的末尾)
void strdelete(linkstring *S,int i,int len){
int k;
linkstring p,q,r;
p=*S,q=NULL,k=1;
while(p&&k<i){
q=p;p=p->next;k++;
}
if(!p) printf("error\n");
else{
k=1;
while(k<len&&p){
p=p->next;k++;
}
if(!p) printf("error2\n");
else{
if(!q){ //说明i=1
r=*S; //抓住要删子串的头,也就是原串的头
*S=p->next; //新头便是要删子串的结尾的下一个
}
else{
r=q->next; //抓住要删子串的头
q->next=p->next; //转移,跳过要删除的子串
}
p->next=NULL; //截住要删子串的尾
while(r!=NULL){ //释放已删子串的空间
p=r;r=r->next;free(p);
}
}
}
}
连接:
void strconcat(linkstring *S1,linkstring S2){
linkstring p;
if(!(*S1)) {
*S1=S2;
return;
}
else{
if(S2){
p=*S1;
while(p->next) p=p->next;
p->next=S2;
}
}
}
截取子串操作:
linkstring substring(linkstring S,int i,int len){
int k;
linkstring p,q,r,t;
p=S, k=1;
while(p&&k<i){
p=p->next;
k++;
}
if(!p){
printf("error\n");
return NULL;
}
else{
r=(linkstring)malloc(sizeof(linkstrnode));
r->data=p->data; r->next=NULL;
k=1; q=r;
while(p->next&&k<len){
p=p->next; k++;
t=(linkstring)malloc(sizeof(linkstrnode));
t->data=p->data;
q->next=t; q=t;
}
if(k<len){
printf("error2\n");
return NULL;
}
else{
q->next=NULL; return r;
}
}
}
感谢阅读!!!
“ Ctrl AC!一起 AC!”