当前位置:   article > 正文

(四)顺序串和链串

顺序串和链串
1.串的概念
        串,即是字符串,也是一种特殊的线性表;其特殊性有两方面:
        1.在逻辑结构方面,串是仅限数据类型为字符,不能是其他数据类型;
        2.在运算方面,将一个串作为整体或者一部分进行运算。
2.几个概念的区别:
        1.空串与空格组成的字符串:空串不包括任何字符,长度为0,而由空格组成的串由于空格也是字符,其长度为空格的个数;
        2.子串与主串:串中任意个连续字符组成的子序列称为子串,包含子串的串称为主串;
        3.字符和子串的位置:单个字符在串中的序号称为字符在串中的位置;子串的第一个字符在串中出现的位置称为子串在串中的位置;
        4.串相等:参加比较的串的长度相等且个位置的字符也相等;
        5.串的比较:以ASCII码值进行比较;
3.串的顺序结构存储及运算:
3.1.串的顺序结构存储:   
        1.顺序结构存储的串简称顺序串,是以一组连续的存储单元进行存储串中的字符序列。
        2.一个字节需要8个字节,因此一个内存单元可以存储多个字符,如一个32位的内存单元可以存储4个字符,因此,串的顺序存储方式有两种:非紧缩格式和紧缩格式;
        3.非紧缩格式是每个存储单元只存储一个字符,紧缩格式是一个存储单元可以存储多个字符;
        4.一般采用的是非紧缩格式的定长存储,即直接按预定的大小,为每个串分配固定长度的存储区;
        5.串的长度的标识有三种,常用的是:串末尾以不会出现在串中的字符'\0'作为结束标志;
3.2.串的基本运算:
        1.求串长:
  1. int str_len(char s[]){
  2. int i=0;
  3. while(s[i]!='\0'){
  4. i++;
  5. }
  6. return i;
  7. }


        2.串连接:
  1. int str_cat(char s1[],char s2[]){
  2. int len1=str_len(s1);
  3. int len2 =str_len(s2);
  4. int i,j;
  5. if(len1+len2>MAXSIZE-1){
  6. puts("超过最大范围!!!");
  7. return 0;
  8. }else{
  9. i=len1;
  10. j=0;
  11. while(s2[j]!='\0'){
  12. s1[i++]=s2[j++];
  13. }
  14. s1[i]='\0';
  15. }
  16. return 1;
  17. }


        3.求子串:
  1. //将s中从第i个位置开始,长度为len的子串通过ss返回
  2. int sub_str(char s[],char ss[],int i,int len){
  3. int slen=str_len(s);
  4. if(i<1||i>slen||len<0||len>slen-i+1){
  5. puts("参数有误!!!");
  6. return 0;
  7. }else{
  8. int j;
  9. for(j=0;j<len;j++){
  10. ss[j]=s[i+j-1];
  11. }
  12. }
  13. return 1;
  14. }
        4.串比较:
  1. int str_cmp(char s1[],char s2[]){
  2. int i=0;
  3. while(s1[i]==s2[i]&&s1[i]!='\0'){
  4. i++;
  5. }
  6. return s1[i]-s2[i];
  7. }
        5.串插入:
  1. //将串s2插入到s1中i的位置
  2. int str_insert(char s1[],int i,char s2[]){
  3. int len1=str_len(s1);
  4. int len2=str_len(s2);
  5. int j,k;
  6. char temp[10];
  7. if(i<0||i>len1+1||len2+len1>MAXSIZE-1){
  8. puts("参数有误!!!");
  9. return 0;
  10. }else{
  11. k=i;
  12. for(j=0;s1[k]!='\0';j++,k++){
  13. temp[j]=s1[k];
  14. }
  15. temp[j]='\0';
  16. j=0;
  17. while(s2[j]!='\0'){
  18. s1[i++]=s2[j++];
  19. }
  20. j=0;
  21. while(temp[j]!='\0'){
  22. s1[i++]=temp[j++];
  23. }
  24. s1[i]='\0';
  25. }
  26. return 1;
  27. }
4.3.串的链式结构存储及运算:
4.1.概念:
        1.串的链式存储结构又称链串,链串的形式一般与链表相同,唯一的区别就是:链串中的一个结点可以存储多个字符;
        2.将链串中每个结点所存储的字符个数称为结点大小;
        3.结点大小大于1时,存储密度高,但是操作效率不高。
4.2.链串的基本运算:
        1.串赋值:将一个数组中的字符赋给链串
  1. void init_Str(LinkStr **str,char s[]){
  2. LinkStr *p,*q;
  3. *s=(LinkStr *)malloc(sizeof(LinkStr));
  4. q=*s;
  5. int i,j;
  6. for(i=0;s[i]!='\0';i++){
  7. p=(LinkStr *)malloc(sizeof(LinkStr));
  8. p->data=s[i];
  9. q->next=p;
  10. q=p;
  11. }
  12. q->next=NULL;
  13. }

        2.求串长:
  1. int str_Length(LinkStr *s){
  2. int i;
  3. LinkStr *p=s->next;
  4. while(p!=NULL){
  5. i++;
  6. p=p->next;
  7. }
  8. return i;
  9. }
        3.串连接:(t保持不变,因此不能直接将t进行操作)
  1. void strCat(LinkStr *s,LinkStr *t){
  2. LinkStr *p,*q,*str,*r;
  3. str=(LinkStr *)malloc(sizeof(LinkStr));
  4. r=str;
  5. p=t->next;
  6. while(p!=NULL){//先将t拷贝到临时变量str中:
  7. q=(LinkStr *)malloc(sizeof(LinkStr));
  8. q->data=p->data;
  9. r->next=q;
  10. r=q;
  11. p=p->next;
  12. }
  13. p=s;
  14. while(p->next!=NULL){//找到s的尾指针
  15. p=p->next;
  16. }
  17. p->next=str->next;//进行链接
  18. free(str);
  19. }
        4.求子串:
  1. void strSub(LinkStr *f,LinkStr **s,int i,int len){
  2. LinkStr *p,*q,*r;
  3. int k;
  4. p=f->next;//第一个元素节点
  5. *s=(LinkStr *)malloc(sizeof(LinkStr));
  6. *s->next=NULL;
  7. r=*s;
  8. if(i<0||i>str_Length(f)||len>str_Length(f)-i+1||len<0){
  9. puts("参数错误!!!");
  10. }else{
  11. for(k=0;k<i-1;k++){//找到i位置结点的前驱结点
  12. p=p->next;
  13. }
  14. for(k=0;k<len;k++){
  15. q=(LinkStr *)malloc(sizeof(LinkStr));
  16. q->data=p->data;
  17. r->next=q;
  18. r=q;
  19. p=p->next;
  20. }
  21. r->next=NULL;
  22. }
  23. }
        5.串插入:
  1. void strInsert(LinkStr *s,int i,LinkStr *t){
  2. LinkStr *p,*q;
  3. p=s->next;//第一个元素节点
  4. q=t;
  5. int k;
  6. for(k=0;k<i-1;k++){//找到i位置结点的前驱结点
  7. p=p->next;
  8. }
  9. r=p->next;//将i元素结点位置的串暂时存在r中
  10. p->next=t->next;//将t中的第一个元素链接到i-1的后面,即i的位置
  11. p=t;
  12. while(p->next!=NULL){//寻找t的尾结点
  13. p=p->next;
  14. }
  15. p->next=r;
  16. }


        
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/523803
推荐阅读
相关标签
  

闽ICP备14008679号