链串的基本运算

链串的定义

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. typedef struct node
  4. {
  5. char data; /*存放字符*/
  6. struct node *next; /*指针域*/
  7. } LinkString;

赋值运算

  1. void Assign(LinkString *&s,char t[])
  2. {
  3. int i=0;
  4. LinkString *q,*tc;
  5. s=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
  6. s->next=NULL;
  7. tc=s; /*tc指向s串的尾结点*/
  8. while (t[i]!='\0')
  9. {
  10. q=(LinkString *)malloc(sizeof(LinkString));
  11. q->data=t[i];
  12. tc->next=q;tc=q;
  13. i++;
  14. }
  15. tc->next=NULL; /*终端结点的next置NULL*/
  16. }

复制运算

  1. void StrCopy(LinkString *&s,LinkString *t) /*t=>s*/
  2. {
  3. LinkString *p=t->next,*q,*tc;
  4. s=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
  5. s->next=NULL;
  6. tc=s; /*tc指向s串的尾结点*/
  7. while (p!=NULL) /*复制t的所有结点*/
  8. {
  9. q=(LinkString *)malloc(sizeof(LinkString));
  10. q->data=p->data;
  11. tc->next=q;tc=q;
  12. p=p->next;
  13. }
  14. tc->next=NULL; /*终端结点的next置NULL*/
  15. }

求串长运算

  1. int StrLength(LinkString *s)
  2. {
  3. int n=0;
  4. LinkString *p=s->next;
  5. while (p!=NULL) /*扫描串s的所有结点*/
  6. {
  7. n++;p=p->next;
  8. }
  9. return(n);
  10. }

判断串相等运算

  1. int StrEqual(LinkString *s,LinkString *t)
  2. {
  3. LinkString *p=s->next,*q=t->next;
  4. while (p!=NULL && q!=NULL) /*比较两串的当前结点*/
  5. {
  6. if (p->data!=q->data) /*data域不等时返回0*/
  7. return(0);
  8. p=p->next;q=q->next;
  9. }
  10. if (p!=NULL || q!=NULL) /*两串长度不等时返回0*/
  11. return(0);
  12. return(1);
  13. }

串连接运算

  1. LinkString *Concat(LinkString *s,LinkString *t)
  2. {
  3. LinkString *p=s->next,*q,*tc,*str;
  4. str=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
  5. str->next=NULL;
  6. tc=str; /*tc总是指向新链表的尾结点*/
  7. while (p!=NULL) /*将s串复制给str*/
  8. {
  9. q=(LinkString *)malloc(sizeof(LinkString));
  10. q->data=p->data;
  11. tc->next=q;tc=q;
  12. p=p->next;
  13. }
  14. p=t->next;
  15. while (p!=NULL) /*将t串复制给str*/
  16. {
  17. q=(LinkString *)malloc(sizeof(LinkString));
  18. q->data=p->data;
  19. tc->next=q;tc=q;
  20. p=p->next;
  21. }
  22. tc->next=NULL;
  23. return(str);
  24. }

求子串运算

  1. LinkString *SubStr(LinkString *s,int i,int j)
  2. {
  3. int k=1;
  4. LinkString *p=s->next,*q,*tc,*str;
  5. str=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
  6. str->next=NULL;
  7. tc=str; /*tc总是指向新链表的尾结点*/
  8. while (k<i && p!=NULL)
  9. {
  10. p=p->next;k++;
  11. }
  12. if (p!=NULL)
  13. {
  14. k=1;
  15. while (k<=j && p!=NULL) /*复制j个结点*/
  16. {
  17. q=(LinkString *)malloc(sizeof(LinkString));
  18. q->data=p->data;
  19. tc->next=q;tc=q;
  20. p=p->next;
  21. k++;
  22. }
  23. tc->next=NULL;
  24. }
  25. return(str);
  26. }

查找子串位置运算

  1. int Index(LinkString *s,LinkString *t)
  2. {
  3. LinkString *p=s->next,*p1,*q,*q1;
  4. int i=0;
  5. while (p!=NULL) /*循环扫描s的每个结点*/
  6. {
  7. q=t->next; /*子串总是从第一个字符开始比较*/
  8. if (p->data==q->data)/*判定两串当前字符相等*/
  9. { /*若首字符相同,则判定s其后字符是否与t的依次相同*/
  10. p1=p->next;q1=q->next;
  11. while (p1!=NULL && q1!=NULL && p1->data==q1->data)
  12. {
  13. p1=p1->next;
  14. q1=q1->next;
  15. }
  16. if (q1==NULL) /*若都相同,则返回相同的子串的起始位置*/
  17. return(i);
  18. }
  19. p=p->next;i++;
  20. }
  21. return(-1); /*若不是子串,返回-1*/
  22. }

子串插入运算

  1. int InsStr(LinkString *&s,int i,LinkString *t)
  2. {
  3. int k;
  4. LinkString *q=s->next,*p,*str;
  5. StrCopy(str,t); /*将t复制到str*/
  6. p=str;str=str->next;
  7. free(p); /*删除str的头结点*/
  8. for (k=1;k<i;k++) /*在s中找到第i-1个结点,由p指向它,q指向下一个结点*/
  9. {
  10. if (q==NULL) /*位置参数i错误*/
  11. return(0);
  12. p=q;
  13. q=q->next;
  14. }
  15. p->next=str; /*将str链表链接到*p之后*/
  16. while (str->next!=NULL) /*由str指向尾结点*/
  17. str=str->next;
  18. str->next=q; /*将*q链接到*str之后*/
  19. return(1);
  20. }

子串删除运算

  1. int DelStr(LinkString *&s,int i,int j)
  2. {
  3. int k;
  4. LinkString *q=s->next,*p,*t;
  5. for (k=1;k<i;k++) /*在s中找到第i-1个结点,由p指向它,q指向下一个结点*/
  6. {
  7. if (q==NULL) /*位置参数i错误*/
  8. return(0);
  9. p=q;
  10. q=q->next;
  11. }
  12. for (k=1;k<=j;k++) /*删除*p之后的j个结点,并由q指向下一个结点*/
  13. {
  14. if (q==NULL) /*长度参数j错误*/
  15. return(0);
  16. t=q;
  17. q=q->next;
  18. free(t);
  19. }
  20. p->next=q;
  21. return(1);
  22. }

子串替换运算

  1. LinkString *RepStrAll(LinkString *s,LinkString *s1,LinkString *s2)
  2. {
  3. int i;
  4. i=Index(s,s1);
  5. while (i>=0)
  6. {
  7. DelStr(s,i+1,StrLength(s1)); /*删除串s1*/
  8. InsStr(s,i+1,s2); /*插入串s2*/
  9. i=Index(s,s1);
  10. }
  11. return(s);
  12. }

输出串运算

  1. void DispStr(LinkString *s)
  2. {
  3. LinkString *p=s->next;
  4. while (p!=NULL)
  5. {
  6. printf("%c",p->data);
  7. p=p->next;
  8. }
  9. printf("\n");
  10. }

main

  1. void main()
  2. {
  3. LinkString *s1,*s2,*s3,*s4,*s5,*s6,*s7;
  4. Assign(s1,"abcd");
  5. printf("s1:");DispStr(s1);
  6. printf("s1的长度:%d\n",StrLength(s1));
  7. printf("s1=>s2\n");
  8. StrCopy(s2,s1);
  9. printf("s2:");DispStr(s2);
  10. printf("s1和s2%s\n",(StrEqual(s1,s2)==1?"相同":"不相同"));
  11. Assign(s3,"12345678");
  12. printf("s3:");DispStr(s3);
  13. printf("s1和s3连接=>s4\n");
  14. s4=Concat(s1,s3);
  15. printf("s4:");DispStr(s4);
  16. printf("s3[2..5]=>s5\n");
  17. s5=SubStr(s3,2,4);
  18. printf("s5:");DispStr(s5);
  19. Assign(s6,"567");
  20. printf("s6:");DispStr(s6);
  21. printf("s6在s3中位置:%d\n",Index(s3,s6));
  22. printf("从s3中删除s3[3..6]字符\n");
  23. DelStr(s3,3,4);
  24. printf("s3:");DispStr(s3);
  25. printf("从s4中将s6替换成s1=>s7\n");
  26. s7=RepStrAll(s4,s6,s1);
  27. printf("s7:");DispStr(s7);
  28. }