数据结构——串的链式存储

来源:互联网 发布:视频桌面软件 编辑:程序博客网 时间:2024/05/29 04:30
#include <iostream>using namespace std;typedef struct node{    char data;    struct node *next;}LinkStrNode;typedef LinkStrNode * LinkString;    //链式串的指针//初始化串void Init_LinkString(LinkString &ls){    ls=(LinkStrNode *)malloc(sizeof(LinkStrNode));    ls->next=NULL;}//打印串void Print_LinkString(LinkString &ls){    if(!ls->next)        cout<<"空串!"<<endl;    else    {        LinkStrNode *cur=ls->next;        while(cur)        {            cout<<cur->data;            cur=cur->next;        }    }}//给串赋值void Build_LinkString(LinkString &ls,char *str){    LinkStrNode *pre=ls;    int length=strlen(str);    int i;    for(i=0;i<length;i++)    {        LinkStrNode *temp=(LinkStrNode *)malloc(sizeof(LinkStrNode));        temp->data=str[i];        temp->next=NULL;        pre->next=temp;        pre=pre->next;    }}//求串的长度int LinkStringLen(LinkString &ls){    int len=0;    LinkStrNode *cur=ls->next;    while(cur)    {        len++;        cur=cur->next;    }    return len;}//串复制/*void LinkStringCopy(LinkString &to,LinkString &from){    LinkStrNode *cur=from->next;    LinkStrNode *pre=to;    while(cur)    {        LinkStrNode *temp=(LinkStrNode *)malloc(sizeof(LinkStrNode));        temp->data=cur->data;        cur=cur->next;        temp->next=NULL;        pre->next=temp;        pre=pre->next;    }}*///串连接/*void LinkStringCat(LinkString &ls1,LinkString &ls2){    LinkStrNode *cur=ls2->next;    LinkStrNode *pre=ls1->next;    while(pre->next!=NULL)        pre=pre->next;    pre->next=cur;}*///串比较/*int LinkStringcmp(LinkString &ls1,LinkString &ls2){    LinkStrNode *cur1=ls1->next;    LinkStrNode *cur2=ls2->next;    while(cur1 && cur2)    {       if(cur1->data != cur2->data)           return cur1->data - cur2->data;       cur1=cur1->next;       cur2=cur2->next;    }    if(cur1)        return 1;    else if(cur2)        return -1;    else        return 0;}*///提取hs1中的子串/*LinkString LinkStringSub(LinkString &ls, int index, int len){    LinkString temp;    Init_LinkString(temp);    int length=LinkStringLen(ls);    if(len>length-index+1)    {        cout<<"提取的子串过长!"<<endl;    }    else    {                LinkStrNode *lscur=ls->next;        LinkStrNode *pre=temp;    //把需要提取的子符复制到temp上        int i=1;        while(i!=index)        {            lscur=lscur->next;            i++;        }        i=1;        while(i<=len)        {            LinkStrNode *lstemp=(LinkStrNode *)malloc(sizeof(LinkStrNode));            lstemp->data=lscur->data;            lscur=lscur->next;            lstemp->next=NULL;            pre->next=lstemp;            pre=pre->next;            i++;        }    }    return temp;}*///向串s中第index个位置插入串tvoid LinkStringInsert(LinkString &s, int index, LinkString &t){    LinkStrNode *spre=s;    //指向被插串的index位置的前一个字符    LinkStrNode *scur=s->next;    //指向被插串的index位置    int i=1;    while(i!=index)    {        spre=scur;        scur=scur->next;        i++;    }    LinkStrNode *tpre=t->next;    //插入串的第一个字符的指针    LinkStrNode *tcur=tpre;        //插入串的最后一个字符的指针    while(tcur->next!=NULL)    {        tcur=tcur->next;    }    tcur->next=scur;    spre->next=tpre;    free(t);}//替换void LinkStringRep(LinkString &s, int index,int len, LinkString &t){    LinkStrNode *scur=s->next;    LinkStrNode *tcur=t->next;    int i=1;    while(i!=index)    {        scur=scur->next;        i++;    }    for(i=0;i<len;i++)    {        if(scur!=NULL)        {            scur->data=tcur->data;            scur=scur->next;            tcur=tcur->next;        }        else        {            scur=(LinkStrNode *)malloc(sizeof(LinkStrNode));            scur->data=tcur->data;            scur->next=NULL;        }    }}int main(){    LinkString ls1;    Init_LinkString(ls1);    //给串赋值    char *str1="Hello World!";    Build_LinkString(ls1,str1);    cout<<LinkStringLen(ls1)<<endl;    //长度    Print_LinkString(ls1);    cout<<endl;    LinkString ls2;    Init_LinkString(ls2);    //给串赋值    char *str2="fuckyou!";    Build_LinkString(ls2,str2);    cout<<LinkStringLen(ls2)<<endl;    Print_LinkString(ls2);    cout<<endl;    //串复制    //LinkString ls3;    //Init_LinkString(ls3);    //LinkStringCopy(ls3,ls1);    //cout<<LinkStringLen(ls3)<<endl;    //Print_LinkString(ls3);    //cout<<endl;    //串连接    //LinkStringCat(ls1,ls2);    //cout<<LinkStringLen(ls1)<<endl;    //Print_LinkString(ls1);    //cout<<endl;    //串1和串2比较    /*    int result=LinkStringcmp(ls1,ls2);    if(result>0)        cout<<"串1大于串2"<<endl;    else if(result==0)        cout<<"串1等于串2"<<endl;    else        cout<<"串1小于串2"<<endl;    */    //提取hs1中的子串    //cout<<"提取的子串是:"<<endl;    //LinkString lssub=LinkStringSub(ls1, 7, 6);    //Print_LinkString(lssub);    //cout<<endl;        //插入串    LinkStringInsert(ls1, 13, ls2);    Print_LinkString(ls1);    cout<<endl;    //替换    LinkString T;    Init_LinkString(T);    char *str3="********";    Build_LinkString(T,str3);    LinkStringRep(ls1, 13,8, T);    Print_LinkString(ls1);    cout<<endl;        return 0;}