本文主要为大家分享一篇如何删除字符串中的子串的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。
话不多说,直接上代码。
算法思想: 找到要删除的第i个结点,逐个删除。
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct node{
datatype x;
struct node *next;
}seqlist;
// 创建带头结点的单链表
seqlist *creat()
{
seqlist *p,*s,*head=null;
datatype ch;
head=(seqlist *)malloc(sizeof(seqlist));
p=head;
head->next=null;
while((ch=getchar())!='\n')
{
s=(seqlist *)malloc(sizeof(seqlist));
s->x=ch;
p->next=s;
p=s;
}
p->next=null;
return head;
}
// 单链表的遍历1
seqlist * display1(seqlist *head)
{
seqlist *p;
p=head->next;
while(p)
{
printf("%c",p->x);
p=p->next;
}
printf("\n");
return head;
}
// 单链表的遍历2 创建这个是因为返回值为null时用1会造成错误。
seqlist * display2(seqlist *head)
{
seqlist *p;
p=head;
while(p)
{
printf("%c",p->x);
p=p->next;
}
printf("\n");
return head;
}
// 字符串子串的删除
seqlist * del(seqlist * head,int i,int len)
{
seqlist *p,*q,*r; // p,q,r 分别为移动,替死符,记录前一个位子。
int k=1;
p=r=head;
while(p && k<=i)
{
r=p;
p=p->next;
k++;
}
if(!p)
{
printf("error1\t 位置超出范围\n");
return (null);
}
else
{
k=1;
while(p && k<=len) //这里需要特别注意出口条件
{
if(p==r)
{
p=p->next;
q=p;
p=q->next;
r->next=q->next;
k++;
free(q);
}
else
{
q=p;
p=q->next;
r->next=q->next;
k++;
free(q);
}
}
if(k<len)
{
printf("error 2\t长度超出范围\n");
return (null);
}
else
return head;
}
}
int main()
{
int i,len;
seqlist *head;
head=creat();
display1(head);
scanf("%d",&i);
scanf("%d",&len);
head=del(head,i,len);
display2(head);
return 0;
}
相关推荐:
删除指定字符串中的子串
在字符串中删除子串
删除字符串中的子串
以上就是如何删除字符串中的子串的详细内容。