2串的链接存储及其部分运算的实现 串的链接存储采用单链表的形式实现,其中每个结 点的定义如下 typedef struct node char data. struct node *next f linkstrnode typedef linkstrnode *linkstring 例如,串S=“ abcde”,其链接存储结构如下图所示 b C d e∧
2 串的链接存储及其部分运算的实现 串的链接存储采用单链表的形式实现,其中每个结 点的定义如下: typedef struct node { char data; struct node *next; } linkstrnode; typedef linkstrnode *linkstring; 例如,串S=“abcde”,其链接存储结构如下图所示: a b c d e ∧ S
(1)创建字符串运算 istrcreate(S) void strcreate(linkstring *S) i char ch; linkstrnode *p,*; *SENULL, =NULL. while((ch=getchar)='\n) [p=(inkstrnode *)malloc(sizeof (linkstrnode)); p->data=ch; if (*S==NULL)*S=p; else r->next=p: r=p/r移向当前链接串的最后一个字符的位置*/ if(r!=NULL)r->next=NUL;/处理表尾结点指针域*/
(1)创建字符串运算strcreate (S) 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; /*r移向当前链接串的最后一个字符的位置*/ } if (r!=NULL) r->next=NULL; /*处理表尾结点指针域*/ }
(2)插入运算 trinsert(s, l,T void strinsert(linkstring*S, int i, lin string T i int k; lin kstring p, q; p=*S, k1 while(p & ki-1) ip=p->next k++;) if(p) printf(error\n) else &a=t while(q->next) q=q->next q->next-p->next; p->next-T
(2)插入运算strinsert(S,i,T) void strinsert(linkstring *S,int i,linkstring T) { int k ; linkstring p,q; p=*S, k=1; while (p && k<i-1) { p=p->next ; k++; } if (!p) printf("error\n"); else { q=T; while(q->next) q=q->next; q->next=p->next; p->next=T; } }
(3)删除运算 strdelete s,i, len) void strdelete(linkstring*S, int i, int len) i int k: linkstring p, q r: p=*S, q=null; k=1: 八用p查找S的第个元素,q始终跟踪p的前驱* while (p &&k<i) (q=p; p=p->next: k++] if (p) printf("errol\n"); else k=1; /p从第个元素开始查找长度为en子串的最后元素* while(k<len & p p=p->next水k++;} if(p) printf("error2\n")
(3)删除运算strdelete(S,i,len) void strdelete(linkstring*S,int i,int len) { int k ; linkstring p,q,r; p=*S, q=null; k=1; /*用p查找S的第i个元素,q始终跟踪p的前驱*/ while (p && k<i) {q=p; p=p->next ; k++;} if (!p) printf("error1\n"); else { k=1; /*p从第i个元素开始查找长度为len子串的最后元素*/ while(k<len && p ) { p=p->next ;k++;} if(!p) printf("error2\n");
else i if (la[ r=*S; *S=p->next; 1 /被删除的子串位于s的最前面* else /*被删除的子串位于S的中间或最后* r=g->next, g->next= p->next, p->next=null. while(r!=null) (p=r; r=r->next, free(p);)
else { if (!q) { r=*S; *S=p->next; } /*被删除的子串位于S的最前面*/ else { /*被删除的子串位于S的中间或最后*/ r=q->next; q->next= p->next; } p->next=null; while (r !=null) {p=r; r=r->next; free(p);} } } }