1. 程式人生 > >串---堆串

串---堆串

rem sign ins start 空間 bsp lse struct 位置

堆串

  字符串包括串名與串值兩部分,而串值采用堆串存儲方法存儲,串名用符號表示存儲

存儲方法

  將一個地址連續,容量很大的存儲空間作為字符串的可用空間,執行程序是動態分配

串名符號表

  所有串的存儲映像構成一個符號表。借助此結構可以在串名與串值之間建立一個對應關系,稱為串名的存儲映像

  插入

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char *str;                        //一塊連續的存儲空間 
    int len;
}HString;

void InitString(HString *s)
{
    s
->str=\0; s->len=0; } void CreateString(HString *s,char a[]) { int i=0,len; if(s->str) free(s->str); //若果串中有元素,銷毀 for(;a[i]!=\0;i++) {} len=i; if(!i) { s->str=\0; s->len=0; } else { s->str=(char
*)malloc(len*sizeof(char)); if(!s->str) exit(0); else for(i=0;i<len;i++) s->str[i]=a[i]; s->len=len; } } int StrEmpty(HString *S) { if (S->len==0) return 1; else return 0; } int StrLength(HString *s) {
return s->len; } void StrInsert(HString *s,char b[],int pos) { int i,len; char *t; if(pos<0||pos>s->len||s->len==0) { printf("插入的位置不合理!\n"); exit(0); } for(i=0;b[i]!=\0;i++) {} len=i; t=(char *)malloc(s->len+len); if(t==NULL) { printf("沒有足夠的內存空間!\n"); exit(0); } i=0; for(i=0;i<pos;i++) t[i]=s->str[i]; for(i=0;i<pos+len;i++) t[i+pos]=b[i]; for(i=pos;i<s->len;i++) t[i+len]=s->str[i]; s->len+=len; free(s->str); s->str=t; } void Print(HString *s) { printf("新的字符串為:\n"); for(int i=0;i<s->len;i++) printf("%c",s->str[i]); printf("\n"); } int main() { int result,pos; HString s; char a[100],b[100]; InitString(&s); printf("請輸入字符串:\n"); gets(a); CreateString(&s,a); result=StrEmpty(&s); if(result) printf("串為空!\n"); else printf("串不為空!\n"); result=StrLength(&s); printf("串的長度為:%d\n",result); printf("請輸入要插入的字符串:\n"); gets(b); printf("請輸入要插入的位置:\n"); scanf("%d",&pos); StrInsert(&s,b,pos); Print(&s); return 0; }

  截取

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char *str;
    int len;
}string;

void InitString(string *s)
{
    s->str=\0;
    s->len=0;
}

void InsertString(string *s,char a[])
{
    int i,len;
    if(s->str)
        free(s->str);
    for(i=0;a[i]!=\0;i++)
    {}
    len=i;
    if(!i)
    {
        s->str=\0;
        s->len=0;
    }
    else
    {
        s->str=(char *)malloc(len);
        if(s==NULL)
        {
            printf("內存不足!\n");
            exit(0);
            
        }
        else
        {
            for(i=0;i<len;i++)
                s->str[i]=a[i];
            s->len=len;
        }
    }
}

void SubString(string *s,int pos,int len)
{
    int i;
    char *p;
    if(pos<0||pos+len>s->len||len<0)
    {
        printf("輸入的位置不合法!\n");
        exit(0);
    }
    if(s->str)
        free(s->str);
    p=(char *)malloc(len*sizeof(char));
    if(!p)
    {
        printf("分配內存失敗!\n");
        exit(0);
    }
    else
    {
        for(i=0;i<len;i++)
            p[i]=s->str[i+pos-1];
        free(s->str);
        s->str=p;
        s->len=len;
    }
    
}
int main()
{
    char a[100];
    int pos,len;
    string s;
    InitString(&s);
    printf("請輸入字符串:\n");
        gets(a);
    InsertString(&s,a);
    printf("請輸入要截取的位置:\n");
        scanf("%d",&pos);
    printf("請輸入要截取的長度:\n");
        scanf("%d",&len);
    SubString(&s,pos,len);
    printf("截取後新的字符串為:\n");
        puts(s.str);
    return 0;
}

  鏈接

#include <stdio.h>
#include <stdlib.h>
typedef struct 
{
    char *str;
    int len;
}string;

void InitString(string *s)
{
    s->str=\0;
    s->len=0;
}

void InsertString(string *s,char a[])
{
    int i,len;
    if(s->str)
        free(s->str);
    for(i=0;a[i]!=\0;i++)
    {}
    len=i;
    if(!i)
    {
        s->str=\0;
        s->len=0;
    }
    else
    {
        s->str=(char *)malloc(len*sizeof(char));
        if(s->str==NULL)
        {
            printf("內存不足!\n");
            exit(0);
        }
        else
        {
            for(i=0;i<len;i++)
                s->str[i]=a[i];
            s->len=len;    
        }
    }
}

void SubString(string *s,char a[])
{
    int i,len;
    char *p;
    for(i=0;a[i]!=\0;i++)
    {}
    len=i;
    p=(char *)malloc(s->len+len);
    if(!p)
    {
        printf("內存不足!\n");
        exit(0);
    }
    else
    {
        for(i=s->len;i<s->len+len;i++)
            s->str[i]=a[i-s->len];
        s->len+=len;
    }
}
int main()
{
    char a[100],b[100];
    string s;
    InitString(&s);
    printf("請輸入字符串:\n");
        gets(a);
    InsertString(&s,a);
    printf("請輸入要鏈接的字符串:\n");
        gets(b);
    SubString(&s,b);
    printf("連接後的新字符串為:\n");
    puts(s.str);
    printf("\n");
    return 0;
}

  刪除

#include <stdio.h>
#include <stdlib.h>
typedef struct 
{
    char *str;
    int len;
}HString;

void InitString(HString *s)
{
    s->str=\0;
    s->len=0;
}

void InsertString(HString *s,char a[])
{
    int i,len;
    if(s->str)
        free(s->str);
    for(i=0;a[i]!=\0;i++)
    {}
    len=i;
    if(!i)
    {
        s->str=\0;
        len=0;
    }
    s->str=(char *)malloc(len*sizeof(char));
    if(s->str==NULL)
    {
        printf("內存不足!\n");
        exit(0);
    }
    for(i=0;i<len;i++)
        s->str[i]=a[i];
    s->len=len;
}
void DeleteString(HString *s,int pos,int len)
{
    char *p;
    if(pos<0||len<0||pos+len-1>s->len)
    {
        printf("輸入的位置不合法!\n");
        exit(0);
    }
    p=(char *)malloc(s->len-len);
    if(!p)
    {
        printf("內存不足!\n");
        exit(0);
    }
    else
    {
        for(int i=0;i<pos-1;i++)
            p[i]=s->str[i];
        for(int i=pos-1;i<s->len-len;i++)
            p[i]=s->str[i+len] ;
        s->len-=len;
        free(s->str);
        s->str=p;
    }
}
int main()
{
    char a[100],b[100];
    HString s;
    int pos,len;
    InitString(&s);
    printf("請輸入字符串:\n");
        gets(a);
    InsertString(&s,a);
    printf("請輸入要刪除的起始位置:\n");
        scanf("%d",&pos);
    printf("請輸入要刪除的長度:\n") ;
        scanf("%d",&len);
    DeleteString(&s,pos,len);
    printf("新的字符串為:\n");
        puts(s.str);
    return 0;
} 

  替換

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char *str;
    int len;
}string;

void InitString(string *s)
{
    s->str=\0;
    s->len=0;
}

void StrAssign(string *s,char a[])
{
    int i,len;
    for(i=0;a[i]!=\0;i++)
    {}
    len=i;
    if(s->str)
        free(s->str);
    if(!i)
    {
        s->str=\0;
        s->len=0;
    }
    else
    {
        s->str=(char *)malloc(len*sizeof(char));
        if(s->str==NULL)
        {
            printf("分配內存失敗!\n");
            exit(0);
        }
        else
        {
            for(i=0;i<len;i++) 
                s->str[i]=a[i];
            s->len=len;
        }
    }
}

int StrLength(string *s)
{
    int len;
    len=s->len;
    return len;    
}

bool StrEmpety(string *s)
{
    if(s->len)
        return true;
    else
        return false;
}

int StrIndex(string *s,int pos,char b[])
{
    int start,j,i,len=0,k;
    for(k=0;b[k]!=\0;k++)
    {}
    len=k;
    if(len==0)
    {
        printf("為空串!\n");
        exit(0);
    }
    start=pos;
    i=start;
    j=0;
    while(i<s->len&&j<len)
    {
        if(s->str[i]==b[j])
        {
            i++;
            j++;
        }
        else
        {
            start++;
            i=start;
            j=0;
        }
    }
    if(j>=len)
    {
        printf("匹配成功!\n");
        return start;
    }
    else
    {
        printf("匹配失敗!\n");
        return 0; 
    }
}

int StrLength(char b[])
{
    int i=0;
    for(;b[i]!=\0;i++)
    {}
    return i;
}

void StrDelete(string *s,int i,int len)
{
    char *p;
    int pos=i;
    if(i<0||len<0||i+len>s->len)
    {
        printf("輸入的位置不合法!\n");
        exit(0);
    }
    p=(char *)malloc(s->len-len);
    if(!p)
    {
        printf("分配內存失敗!\n");
        exit(0);
    }
    for(int j=0;j<pos-1;j++)
        p[j]=s->str[j];
    for(int j=pos-1;j<s->len-len;j++)
        p[j]=s->str[j+len];
    s->len-=len;
    free(s->str);
    s->str=p;
}

int StrInsert(string *s,int pos,char c[])
{
    int i=0,len=0;
    for(;c[i]!=\0;i++)
    {}
    len=i;
    if(pos<0||pos-1>s->len)
    {
        printf("插入的位置不合法!\n");
        exit(0);
    }
    char *p;
    p=(char *)realloc(s->str,(s->len+len)*sizeof(char));
    if(!p)
    {
        printf("內存分配失敗!\n");
        exit(0);
    }
    for(i=s->len-1;i>=pos-1;i--)
        s->str[i+len]=s->str[i];
    for(i=0;i<len;i++)
        s->str[pos-1+i]=c[i];
    s->len+=len;
    return 1;
}
void StrReplace(string *s,char b[],char c[])
{
    int i=0,flag;
    if(!StrEmpety(s))
    {
        printf("字符串為空!\n");
        exit(0);
    }
    i=StrIndex(s,i,b);

    while(i<s->len)
    {
        StrDelete(s,i,StrLength(b));
        flag=StrInsert(s,i,c);
        if(!flag)
            return;
        i+=StrLength(c);
    }
}

int main()
{
    string s;
    char a[100],b[100],c[100];
    InitString(&s);
    printf("請輸入字符串:\n");
        gets(a);
    StrAssign(&s,a);
    printf("請輸入要被替換的字符串:\n");
        gets(b);
    printf("請輸入要替換的字符串:\n");
        gets(c);
    StrReplace(&s,b,c);
    printf("新的字符串為:\n");
        puts(s.str);
    return 0;
}

串---堆串