数据结构——串的链式存储
来源:互联网 发布:视频桌面软件 编辑:程序博客网 时间: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;}