この記事は主に文字列内の部分文字列を削除する方法に関する記事を共有するものであり、参考になると思います。編集者をフォローして見てみましょう。
早速、コードに進みましょう。
アルゴリズムのアイデア: 削除する i 番目のノードを見つけて、1 つずつ削除します。
#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; }
関連する推奨事項:
以上が文字列から部分文字列を削除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。