zoukankan      html  css  js  c++  java
  • 链串的基本运算

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #define CHUNKSIZE 10  
    #define stuff '#'  
    typedef struct Chunk  
    {  
        char ch[CHUNKSIZE];  
        struct Chunk *next;  
    }Chunk;//串的结点类型定义  
    typedef struct  
    {  
        Chunk *head;  
        Chunk *tail;  
        int length;  
    }LinkString;  
      
    void InitString(LinkString *S);//初始化字符串  
    int StrAssign(LinkString *S,char *cstr);//生成串  
    int StrEmpty(LinkString S);//推断出串是否为空  
    int StrLength(LinkString S);//求串长度  
    int StrCopy(LinkString *T,LinkString S);//串的复制操作  
    int ToChars(LinkString S,char **cstr);//串的转换操作  
    int StrCompare(LinkString S,LinkString T);//串的比較操作  
    int StrConcat(LinkString *T,LinkString S);//串的连接操作  
    int StrInsert(LinkString *S,int pos,LinkString T);//串的插入操作  
    int StrDelete(LinkString *S,int pos,int len);//串的删除操作  
    int SubString(LinkString *Sub,LinkString S,int pos,int len);//取子串操作  
    void ClearString(LinkString *S);//清空串操作  
    
    
    
    #include "LinkString.h"  
      
    void InitString(LinkString *S)//初始化字符串  
    {  
        S->length = 0;  
        S->head = NULL;  
        S->tail = NULL;  
    }  
    int StrAssign(LinkString *S,char *cstr)//生成串  
    {  
        Chunk *p,*q;  
        int i,j,k,len;  
        len = strlen(cstr);  
        if(!len)  
        {  
            return 0;  
        }  
        S->length = len;  
        j = len/CHUNKSIZE;  
        if(len % CHUNKSIZE)  
        {  
            j++;  
        }  
        for(i = 0;i < j;i++)  
        {  
            p = (Chunk*)malloc(sizeof(Chunk));  
            if(!p)  
            {  
                return 0;  
            }  
            for(k = 0;k < CHUNKSIZE && *cstr;k++)  
            {  
                *(p->ch + k) = *cstr++;  
            }  
            if(0 == i)  
            {  
                S->head = q;  
                q = p;  
            }  
            else  
            {  
                q->next = p;  
                q = p;  
            }  
            if(!*cstr)  
            {  
                S->tail = q;  
                q->next = NULL;  
                for(;k < CHUNKSIZE;k++)  
                {  
                    *(q->ch + k) = stuff;  
                }  
            }  
        }  
        return 1;  
    }  
    int StrEmpty(LinkString S)//推断出串是否为空  
    {  
        if(S.length == 0)  
        {  
            return 1;  
        }  
        else  
        {  
            return 0;  
        }  
    }  
    int StrLength(LinkString S)//求串长度  
    {  
        return S.length;  
    }  
    int StrCopy(LinkString *T,LinkString S)//串的复制操作  
    {  
        char *str;  
        int flag;  
        if(!ToChars(S,&str))  
        {  
            return 0;  
        }  
        flag = StrAssign(T,str);  
        free(str);  
        return flag;  
    }  
    int ToChars(LinkString S,char **cstr)//串的转换操作  
    {  
        Chunk *p = S.head ;  
        int i;  
        char *q;  
        *cstr = (char*)malloc((S.length + 1)*sizeof(char));  
        if(!cstr||!S.length)  
        {  
            return 0;  
        }  
        q = *cstr;  
        while(p)  
        {  
            for(i = 0;i < CHUNKSIZE;i++)  
            {  
                if(p->ch[i] != stuff)  
                {  
                    *q++ = (p->ch[i]);  
                }  
            }  
            p = p->next ;  
        }  
        (*cstr)[S.length] = 0;  
        return 1;  
    }  
    int StrCompare(LinkString S,LinkString T)//串的比較操作  
    {  
        char *p,*q;  
        int flag;  
        if(!ToChars(S,&p))  
        {  
            return 0;  
        }  
        if(!ToChars(T,&q))  
        {  
            return 0;  
        }  
        for(;*p != ''&&*q != '';)  
        {  
            if(*p == *q)  
            {  
                p++;  
                q++;  
            }  
            else  
            {  
                flag = *p - *q;  
            }  
        }  
        free(p);  
        free(q);  
        if(*p == ''||*q == '')  
        {  
            return S.length - T.length ;  
        }  
        else  
        {  
            return flag;  
        }  
    }  
    int StrConcat(LinkString *T,LinkString S)//串的连接操作  
    {  
        int flag1,flag2;  
        LinkString S1,S2;  
        InitString(&S1);  
        InitString(&S2);  
        flag1 = StrCopy(&S1,*T);  
        flag2 = StrCopy(&S2,S);  
        if(flag1 == 0 || flag2 == 0)  
        {  
            return 0;  
        }  
        T->head = S1.head ;  
        S1.tail->next = S2.head ;  
        T->tail = S2.tail ;  
        T->length = S1.length + S2.length ;  
        return 1;  
    }  
    int StrInsert(LinkString *S,int pos,LinkString T)//串的插入操作  
    {  
        char *t1,*s1;  
        int i,j;  
        int flag;  
        if(pos < 1 || pos > S->length-1)  
        {  
            return 0;  
        }  
        if(!ToChars(*S,&s1))  
        {  
            return 0;  
        }  
        if(!ToChars(T,&t1))  
        {  
            return 0;  
        }  
        j = strlen(s1);  
        s1 = (char*)realloc(s1,(j+strlen(t1)+1)*sizeof(char));  
        for(i = j;i >= pos-1;i--)  
        {  
            s1[i+strlen(t1)] = s1[i];  
        }  
        for(i = 0;i <(int)strlen(t1);i++)  
        {  
            s1[pos+i-1] = t1[i];  
        }  
        InitString(S);  
        flag = StrAssign(S,s1);  
        free(s1);  
        free(t1);  
        return flag;  
    }  
    int StrDelete(LinkString *S,int pos,int len)//串的删除操作  
    {  
        char *str;  
        int i;  
        int flag;  
        if(pos < 1 || len < 0 || pos > S->length-len+1)  
        {  
            return 0;  
        }  
        if(!ToChars(*S,&str))  
        {  
            return 0;  
        }  
        for(i = pos+len-1;i <= (int)strlen(str);i++)  
        {  
            str[i-len] = str[i];  
        }  
        InitString(S);  
        flag = StrAssign(S,str);  
        free(str);  
        return flag;  
    }  
    int SubString(LinkString *Sub,LinkString S,int pos,int len)  
    {  
        char *t,*str;  
        int flag;  
        if(pos < 1||pos > S.length||len < 0||len > S.length - pos + 1)  
        {  
            return 0;  
        }  
        if(!ToChars(S,&str))  
        {  
            return 0;  
        }  
        t = pos+str-1;  
        t[len] = '';  
        flag = StrAssign(Sub,t);  
        free(str);  
        return flag;  
    }//取子串操作  
    void ClearString(LinkString *S)//清空串操作  
    {  
        Chunk *p,*q;  
        p = S->head ;  
        while(p)  
        {  
            q = p->next ;  
            free(p);  
            p = q;  
        }  
        S->head = NULL;  
        S->tail = NULL;  
        S->length = 0;  
    }  

  • 相关阅读:
    Oracle:SQL语句--撤销用户权限
    Oracle:SQL语句--给用户赋权限
    RSTP端口状态迁移过程详解
    LSB算法分析与实现
    工厂方法模式
    Ceasar
    区域性名称和标识符
    Packet Tracer网络模拟实验实记
    H3C-OSPF
    H3C-RIP
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6696215.html
Copyright © 2011-2022 走看看