4-2鏈串基本運算的演算法
阿新 • • 發佈:2019-02-01
//鏈串基本運算的演算法 #include <stdio.h> #include <malloc.h> typedef struct snode { char data; struct snode *next; } LinkStrNode; void StrAssign(LinkStrNode *&s,char cstr[]) //字串常量cstr賦給串s { int i; LinkStrNode *r,*p; s=(LinkStrNode *)malloc(sizeof(LinkStrNode)); r=s; //r始終指向尾結點 for (i=0;cstr[i]!='\0';i++) { p=(LinkStrNode *)malloc(sizeof(LinkStrNode)); p->data=cstr[i]; r->next=p;r=p; } r->next=NULL; } void DestroyStr(LinkStrNode *&s) { LinkStrNode *pre=s,*p=s->next; //pre指向結點p的前驅結點 while (p!=NULL) //掃描鏈串s { free(pre); //釋放pre結點 pre=p; //pre、p同步後移一個結點 p=pre->next; } free(pre); //迴圈結束時,p為NULL,pre指向尾結點,釋放它 } void StrCopy(LinkStrNode *&s,LinkStrNode *t) //串t複製給串s { LinkStrNode *p=t->next,*q,*r; s=(LinkStrNode *)malloc(sizeof(LinkStrNode)); r=s; //r始終指向尾結點 while (p!=NULL) //將t的所有結點複製到s { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } r->next=NULL; } bool StrEqual(LinkStrNode *s,LinkStrNode *t) //判串相等 { LinkStrNode *p=s->next,*q=t->next; while (p!=NULL && q!=NULL && p->data==q->data) { p=p->next; q=q->next; } if (p==NULL && q==NULL) return true; else return false; } int StrLength(LinkStrNode *s) //求串長 { int i=0; LinkStrNode *p=s->next; while (p!=NULL) { i++; p=p->next; } return i; } LinkStrNode *Concat(LinkStrNode *s,LinkStrNode *t) //串連線 { LinkStrNode *str,*p=s->next,*q,*r; str=(LinkStrNode *)malloc(sizeof(LinkStrNode)); r=str; while (p!=NULL) //將s的所有結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } p=t->next; while (p!=NULL) //將t的所有結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } r->next=NULL; return str; } LinkStrNode *SubStr(LinkStrNode *s,int i,int j) //求子串 { int k; LinkStrNode *str,*p=s->next,*q,*r; str=(LinkStrNode *)malloc(sizeof(LinkStrNode)); str->next=NULL; r=str; //r指向新建連結串列的尾結點 if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) return str; //引數不正確時返回空串 for (k=0;k<i-1;k++) p=p->next; for (k=1;k<=j;k++) //將s的第i個結點開始的j個結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } r->next=NULL; return str; } LinkStrNode *InsStr(LinkStrNode *s,int i,LinkStrNode *t) //串插入 { int k; LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r; str=(LinkStrNode *)malloc(sizeof(LinkStrNode)); str->next=NULL; r=str; //r指向新建連結串列的尾結點 if (i<=0 || i>StrLength(s)+1) //引數不正確時返回空串 return str; for (k=1;k<i;k++) //將s的前i個結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } while (p1!=NULL) //將t的所有結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p1->data; r->next=q;r=q; p1=p1->next; } while (p!=NULL) //將結點p及其後的結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } r->next=NULL; return str; } LinkStrNode *DelStr(LinkStrNode *s,int i,int j) //串刪去 { int k; LinkStrNode *str,*p=s->next,*q,*r; str=(LinkStrNode *)malloc(sizeof(LinkStrNode)); str->next=NULL; r=str; //r指向新建連結串列的尾結點 if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) return str; //引數不正確時返回空串 for (k=0;k<i-1;k++) //將s的前i-1個結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } for (k=0;k<j;k++) //讓p沿next跳j個結點 p=p->next; while (p!=NULL) //將結點p及其後的結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data; r->next=q;r=q; p=p->next; } r->next=NULL; return str; } LinkStrNode *RepStr(LinkStrNode *s,int i,int j,LinkStrNode *t) //串替換 { int k; LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r; str=(LinkStrNode *)malloc(sizeof(LinkStrNode)); str->next=NULL; r=str; //r指向新建連結串列的尾結點 if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) return str; //引數不正確時返回空串 for (k=0;k<i-1;k++) //將s的前i-1個結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data;q->next=NULL; r->next=q;r=q; p=p->next; } for (k=0;k<j;k++) //讓p沿next跳j個結點 p=p->next; while (p1!=NULL) //將t的所有結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p1->data;q->next=NULL; r->next=q;r=q; p1=p1->next; } while (p!=NULL) //將結點p及其後的結點複製到str { q=(LinkStrNode *)malloc(sizeof(LinkStrNode)); q->data=p->data;q->next=NULL; r->next=q;r=q; p=p->next; } r->next=NULL; return str; } void DispStr(LinkStrNode *s) //輸出串 { LinkStrNode *p=s->next; while (p!=NULL) { printf("%c",p->data); p=p->next; } printf("\n"); }