第八周项目2-建立链串的算法库

来源:互联网 发布:淘宝客服业绩软件 编辑:程序博客网 时间:2024/05/16 19:25
/*  *Copyright(c++)2014 烟台大学计算机学院       *All rights reserved.       *文件名称:liSting.h/liSting.cpp/main.cpp  *作者:李宁       *完成日期:2015.10.23   *版本号:v1.0       *       *问题描述:定义链串的存储结构,实现串的基本运算,并完成测试。   *程序输出:链串的基本运算如下:            (1)建立串s和串s1            (2)输出串s:abcdefghijklmn            (2)输出串s1:123            (3)串s的长度:14            (4)在串s的第9个字符位置插入串s1而产生串s2            (5)输出串s2:abcdefgh123ijklmn            (6)删除串s第2个字符开始的5个字符而产生串s2            (7)输出串s2:aefghijklmn            (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2            (9)输出串s2:a123ghijklmn            (10)提取串s的第2个字符开始的10个字符而产生串s3            (11)输出串s3:bcdefghijk            (12)将串s1和串s2连接起来而产生串s4            (13)输出串s4:123a123ghijklmn */    //1:在同一项目(project)中建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。 例:#include <stdio.h>#include "liString.h"int main(){    LiString *s,*s1,*s2,*s3,*s4;    printf("链串的基本运算如下:\n");    printf("  (1)建立串s和串s1\n");    StrAssign(s,"abcdefghijklmn");    printf("  (2)输出串s:");    DispStr(s);    StrAssign(s1,"123");    printf("  (2)输出串s1:");    DispStr(s1);    printf("  (3)串s的长度:%d\n",StrLength(s));    printf("  (4)在串s的第9个字符位置插入串s1而产生串s2\n");    s2=InsStr(s,9,s1);    printf("  (5)输出串s2:");    DispStr(s2);    printf("  (6)删除串s第2个字符开始的5个字符而产生串s2\n");    s2=DelStr(s,2,3);    printf("  (7)输出串s2:");    DispStr(s2);    printf("  (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");    s2=RepStr(s,2,5,s1);    printf("  (9)输出串s2:");    DispStr(s2);    printf("  (10)提取串s的第2个字符开始的10个字符而产生串s3\n");    s3=SubStr(s,2,10);    printf("  (11)输出串s3:");    DispStr(s3);    printf("  (12)将串s1和串s2连接起来而产生串s4\n");    s4=Concat(s1,s2);    printf("  (13)输出串s4:");    DispStr(s4);    return 0;}

//2:源文件:liString.cpp,包含实现各种算法的函数的定义#include <stdio.h>#include <malloc.h>#include "liString.h"void StrAssign(LiString *&s,char cstr[])    //字符串常量cstr赋给串s{    int i;    LiString *r,*p;    s=(LiString *)malloc(sizeof(LiString));    r=s;                        //r始终指向尾节点    for (i=0;cstr[i]!='\0';i++)    {   p=(LiString *)malloc(sizeof(LiString));        p->data=cstr[i];        r->next=p;r=p;    }    r->next=NULL;}void StrCopy(LiString *&s,LiString *t)  //串t复制给串s{    LiString *p=t->next,*q,*r;    s=(LiString *)malloc(sizeof(LiString));    r=s;                //r始终指向尾节点    while (p!=NULL)     //将t的所有节点复制到s    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    r->next=NULL;}bool StrEqual(LiString *s,LiString *t)  //判串相等{    LiString *p=s->next,*q=t->next;    while (p!=NULL && q!=NULL && p->data==q->data)    {   p=p->next;        q=q->next;    }    if (p==NULL && q==NULL)        return true;    else        return false;}int StrLength(LiString *s)  //求串长{    int i=0;    LiString *p=s->next;    while (p!=NULL)    {   i++;        p=p->next;    }    return i;}LiString *Concat(LiString *s,LiString *t)   //串连接{    LiString *str,*p=s->next,*q,*r;    str=(LiString *)malloc(sizeof(LiString));    r=str;    while (p!=NULL)         //将s的所有节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    p=t->next;    while (p!=NULL)         //将t的所有节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    r->next=NULL;    return str;}LiString *SubStr(LiString *s,int i,int j)   //求子串{    int k;    LiString *str,*p=s->next,*q,*r;    str=(LiString *)malloc(sizeof(LiString));    str->next=NULL;    r=str;                      //r指向新建链表的尾节点    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))        return str;             //参数不正确时返回空串    for (k=0;k<i-1;k++)        p=p->next;    for (k=1;k<=j;k++)          //将s的第i个节点开始的j个节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    r->next=NULL;    return str;}LiString *InsStr(LiString *s,int i,LiString *t)     //串插入{    int k;    LiString *str,*p=s->next,*p1=t->next,*q,*r;    str=(LiString *)malloc(sizeof(LiString));    str->next=NULL;    r=str;                              //r指向新建链表的尾节点    if (i<=0 || i>StrLength(s)+1)       //参数不正确时返回空串        return str;    for (k=1;k<i;k++)                   //将s的前i个节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    while (p1!=NULL)                    //将t的所有节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p1->data;        r->next=q;r=q;        p1=p1->next;    }    while (p!=NULL)                     //将*p及其后的节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    r->next=NULL;    return str;}LiString *DelStr(LiString *s,int i,int j)   //串删去{    int k;    LiString *str,*p=s->next,*q,*r;    str=(LiString *)malloc(sizeof(LiString));    str->next=NULL;    r=str;                      //r指向新建链表的尾节点    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))        return str;             //参数不正确时返回空串    for (k=0;k<i-1;k++)         //将s的前i-1个节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    for (k=0;k<j;k++)               //让p沿next跳j个节点        p=p->next;    while (p!=NULL)                 //将*p及其后的节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;        r->next=q;r=q;        p=p->next;    }    r->next=NULL;    return str;}LiString *RepStr(LiString *s,int i,int j,LiString *t)   //串替换{    int k;    LiString *str,*p=s->next,*p1=t->next,*q,*r;    str=(LiString *)malloc(sizeof(LiString));    str->next=NULL;    r=str;                          //r指向新建链表的尾节点    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))        return str;                 //参数不正确时返回空串    for (k=0;k<i-1;k++)             //将s的前i-1个节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;q->next=NULL;        r->next=q;r=q;        p=p->next;    }    for (k=0;k<j;k++)               //让p沿next跳j个节点        p=p->next;    while (p1!=NULL)                //将t的所有节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p1->data;q->next=NULL;        r->next=q;r=q;        p1=p1->next;    }    while (p!=NULL)                 //将*p及其后的节点复制到str    {   q=(LiString *)malloc(sizeof(LiString));        q->data=p->data;q->next=NULL;        r->next=q;r=q;        p=p->next;    }    r->next=NULL;    return str;}void DispStr(LiString *s)   //输出串{    LiString *p=s->next;    while (p!=NULL)    {   printf("%c",p->data);        p=p->next;    }    printf("\n");}

//3:头文件:liString.h,包含定义链队数据结构的代码、宏定义、要实现算法的函数的声明;#ifndef LISTRING_H_INCLUDED#define LISTRING_H_INCLUDEDtypedef struct snode{    char data;    struct snode *next;} LiString;void StrAssign(LiString *&s,char cstr[]);   //字符串常量cstr赋给串svoid StrCopy(LiString *&s,LiString *t); //串t复制给串sbool StrEqual(LiString *s,LiString *t); //判串相等int StrLength(LiString *s); //求串长LiString *Concat(LiString *s,LiString *t);  //串连接LiString *SubStr(LiString *s,int i,int j);  //求子串LiString *InsStr(LiString *s,int i,LiString *t) ;   //串插入LiString *DelStr(LiString *s,int i,int j);  //串删去LiString *RepStr(LiString *s,int i,int j,LiString *t);  //串替换void DispStr(LiString *s);  //输出串#endif // LISTRING_H_INCLUDED


输出结果:

知识点总结:

链串的存储结构具有方便删除和查找的特点,运算方便

学习心得:

知识总得静下心来一点一点的积累

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 凉鞋买大了一码怎么办 皮鞋小了一码怎么办妙招 图书馆借的书本损坏了怎么办 把人打伤没钱赔怎么办 小孩不小心打伤了老师怎么办 高考进了三段怎么办 工作中和领导产生冲突怎么办 酒店不给员工发工资怎么办 裙子没有解开超市的锁怎么办 接待老外听不懂他说的怎么办 脚脱皮又痒又臭怎么办 成都应聘平面模特被骗了怎么办 文明6开场一堆蛮族怎么办 幼儿园里出了水痘怎么办 穿高跟鞋脚容易出汗怎么办 粗跟鞋走路太响怎么办 粗跟鞋鞋跟很响怎么办 皮鞋跟走路太响怎么办 穿高跟鞋脚崴了怎么办 高跟鞋小了一码怎么办 高跟皮鞋磨脚怎么办 大同同煤集团三供一业人员怎么办 小孩被猫咪抓了怎么办 长得特别丑的人怎么办 锅巴放的不脆了怎么办 淘宝买到假货了怎么办 单位不给解约函怎么办 安卓个人热点打不开怎么办 密码忘记无法进入主机怎么办 流放之路w10闪退怎么办 电脑网站被劫持了怎么办 苹果手机浏览器被劫持怎么办 苹果手机网站被劫持怎么办 a37手机网站被劫持怎么办 耳朵被震的耳鸣怎么办 液晶电视怎么办断屏坏还是逻辑板 门保险拧坏了怎么办 锁的保险坏了怎么办 鞋子里面长霉了怎么办 塑料瓶盖滑丝了怎么办? 塑料杯盖滑丝了怎么办