• 链串的基本运算
    • 链串的定义
    • 赋值运算
    • 复制运算
    • 求串长运算
    • 判断串相等运算
    • 串连接运算
    • 求子串运算
    • 查找子串位置运算
    • 子串插入运算
    • 子串删除运算
    • 子串替换运算
    • 输出串运算
    • main

    链串的基本运算

    链串的定义

    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. }