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

  1. /* 
  2.  
  3. copyright (t) 2016,烟台大学计算机学院 
  4.  
  5. *All rights reserved. 
  6.  
  7. *文件名称:1.cpp 
  8.  
  9. *作者:车金阳 
  10.  
  11. *完成日期:2016年11月8日 
  12.  
  13. *版本号:v1.0 
  14.  
  15. *问题描述:定义链串的存储结构,实现其基本运算,并完成测试。 
  16.  
  17. 要求: 
  18.   1、头文件listring.h中定义数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括: 
  19.         void StrAssign(LiString &s,char cstr[]);              //字符串常量cstr赋给串s 
  20.         void StrCopy(LiString &s,LiString t);                 //串t复制给串s 
  21.         bool StrEqual(LiString s,LiString t);                 //判串相等 
  22.         int StrLength(LiString s);                            //求串长 
  23.         SqString Concat(LiString s,LiString t);               //串连接 
  24.         SqString SubStr(LiString s,int i,int j);              //求子串 
  25.         SqString InsStr(LiString s1,int i,LiString s2);       //串插入 
  26.         SqString DelStr(LiString s,int i,int j);              //串删去 
  27.         SqString RepStr(LiString s,int i,int j,LiString t);   //串替换 
  28.         void DispStr(SqString s);                             //输出串 
  29.     2、在listring.cpp中实现这些函数 
  30.     3、在main函数中完成测试,包括如下内容: 
  31.     (1)建立串s:abcdefghijklmn和串s1:123 
  32.     (2)输出串s和s1 
  33.     (3)输出串s的长度 
  34.     (4)在串s的第9个字符位置插入串s1而产生串s2 
  35.     (5)输出串s2 
  36.     (6)删除串s第2个字符开始的5个字符而产生串s2 
  37.     (7)输出串s2 
  38.     (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2 
  39.     (9)输出串s2 
  40.     (10)提取串s的第2个字符开始的10个字符而产生串s3 
  41.     (11)输出串s3 
  42.     (12)将串s1和串s2连接起来而产生串s4 
  43.     (13)输出串s4 
  44.  
  45. *输入描述:无 
  46.  
  47. *程序输出:完成测试后的运行结果 
  48.  
  49. */  

listring.h:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. typedef struct snode                                    //定义链串节点类型  
  4. {  
  5.     char data;  
  6.     struct snode *next;  
  7. } LiString;  
  8. void StrAssign(LiString *&s,char cstr[]);               //字符串常量cstr赋给串s  
  9. void StrCopy(LiString *&s,LiString *t);                 //串t复制给串s  
  10. bool StrEqual(LiString *s,LiString *t);                 //判串相等  
  11. int StrLength(LiString *s);                             //求串长  
  12. LiString *Concat(LiString *s,LiString *t);              //串连接  
  13. LiString *SubStr(LiString *s,int i,int j);              //求子串  
  14. LiString *InsStr(LiString *s,int i,LiString *t);        //串插入  
  15. LiString *DelStr(LiString *s,int i,int j) ;             //串删去  
  16. LiString *RepStr(LiString *s,int i,int j,LiString *t);  //串替换  
  17. void DispStr(LiString *s);                              //输出串  

listring.cpp:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "listring.h"  
  2. void StrAssign(LiString *&s,char cstr[])                   //字符串常量cstr赋给串s  
  3. {  
  4.     //尾插法建立链串s  
  5.     int i;  
  6.     LiString *r,*p;                                        //*r为尾指针  
  7.     s=(LiString *)malloc(sizeof(LiString));                //分配字符串s的空间  
  8.     r=s;  
  9.     for(i=0;cstr[i]!='\0';i++)  
  10.     {  
  11.         p=(LiString *)malloc(sizeof(LiString));            //分配存放字符节点的空间  
  12.         p->data=cstr[i];  
  13.         r->next=p;  
  14.         r=p;  
  15.     }  
  16.     r->next=NULL;  
  17. }  
  18. void StrCopy(LiString *&s,LiString *t)                     //串t复制给串s  
  19. {  
  20.     //尾插法建立链串s  
  21.     LiString *p=t->next,*q,*r;  
  22.     s=(LiString *)malloc(sizeof(LiString));  
  23.     r=s;  
  24.     while(p!=NULL)  
  25.     {  
  26.         q=(LiString *)malloc(sizeof(LiString));  
  27.         q->data=p->data;  
  28.         r->next=q;  
  29.         r=q;  
  30.         p=p->next;  
  31.     }  
  32.     r->next=NULL;  
  33. }  
  34. bool StrEqual(LiString *s,LiString *t)                    //判串相等  
  35. {  
  36.     LiString *p=s->next,*q=t->next;  
  37.     while(p!=NULL && q!=NULL && p->data==q->data)         //p.q两指针相伴而随  
  38.     {  
  39.         p=p->next;  
  40.         q=q->next;  
  41.     }  
  42.     if(p==NULL && q==NULL)                                //跳出循环时两串所有data均相同且长度相同,返回真,否则返回假  
  43.         return true;  
  44.     else  
  45.         return false;  
  46. }  
  47. int StrLength(LiString *s)                                //求串长  
  48. {  
  49.     LiString *p=s->next;  
  50.     int len=0;  
  51.     while(p!=NULL)  
  52.     {  
  53.         len++;  
  54.         p=p->next;  
  55.     }  
  56.     return len;  
  57. }  
  58. LiString *Concat(LiString *s,LiString *t)                  //串连接  
  59. {  
  60.     LiString *str,*p=s->next,*p1=t->next,*q,*r;  
  61.     str=(LiString *)malloc(sizeof(LiString));             //构造只有头节点的新串  
  62.     r=str;  
  63.     //尾插法插入(复制)节点  
  64.     while(p!=NULL)                                        //串s复制到新串中  
  65.     {  
  66.         q=(LiString *)malloc(sizeof(LiString));  
  67.         q->data=p->data;  
  68.         r->next=q;  
  69.         r=q;  
  70.         p=p->next;  
  71.     }  
  72.     while(p1!=NULL)                                        //串t复制到新串中  
  73.     {  
  74.         q=(LiString *)malloc(sizeof(LiString));  
  75.         q->data=p1->data;  
  76.         r->next=q;  
  77.         r=q;  
  78.         p1=p1->next;  
  79.     }  
  80.     r->next=NULL;  
  81.     return str;  
  82. }  
  83. LiString *SubStr(LiString *s,int i,int j)                  //求子串  
  84. {  
  85.     int k;  
  86.     LiString *str,*p=s->next,*q,*r;  
  87.     str=(LiString *)malloc(sizeof(LiString));             //构造空的新串  
  88.     str->next=NULL;  
  89.     r=str;                                                //r指向新串(新建链表)的尾节点  
  90.     if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))  
  91.         return str;                                       //参数不正确时返回空串  
  92.     for(k=0;k<i-1;k++)                                    //寻找子串位置,循环跳出后p指向s的第i个节点  
  93.         p=p->next;  
  94.     for(k=1;k<=j;k++)  
  95.     {  
  96.         q=(LiString *)malloc(sizeof(LiString));  
  97.         q->data=p->data;  
  98.         r->next=q;  
  99.         r=q;  
  100.         p=p->next;  
  101.     }  
  102.     r->next=NULL;  
  103.     return str;  
  104. }  
  105. LiString *InsStr(LiString *s,int i,LiString *t)            //串插入  
  106. {  
  107.     int k;  
  108.     LiString *str,*p=s->next,*p1=t->next,*q,*r;  
  109.     str=(LiString *)malloc(sizeof(LiString));             //构造空的新串  
  110.     str->next=NULL;  
  111.     r=str;                                                //r指向新串(新建链表)的尾节点  
  112.     if(i<=0 || i>StrLength(s)+1)  
  113.         return str;                                       //参数不正确时返回空串  
  114.     for(k=1;k<i;k++)                                      //s的前i个节点复制到str  
  115.     {  
  116.         q=(LiString *)malloc(sizeof(LiString));  
  117.         q->data=p->data;  
  118.         r->next=q;  
  119.         r=q;  
  120.         p=p->next;                                        //跳出循环前这一步记录复制*p指向的节点  
  121.     }  
  122.     while(p1!=NULL)                                       //串t复制到str  
  123.     {  
  124.         q=(LiString *)malloc(sizeof(LiString));  
  125.         q->data=p1->data;  
  126.         r->next=q;  
  127.         r=q;  
  128.         p1=p1->next;  
  129.     }  
  130.     while(p!=NULL)                                        //*p及其后的节点复制到str  
  131.     {  
  132.         q=(LiString *)malloc(sizeof(LiString));  
  133.         q->data=p->data;  
  134.         r->next=q;  
  135.         r=q;  
  136.         p=p->next;  
  137.     }  
  138.     r->next=NULL;  
  139.     return str;  
  140. }  
  141. LiString *DelStr(LiString *s,int i,int j)                  //串删去  
  142. {  
  143.     int k;  
  144.     LiString *str,*p=s->next,*q,*r;  
  145.     str=(LiString *)malloc(sizeof(LiString));             //构造空的新串  
  146.     str->next=NULL;  
  147.     r=str;                                                //r指向新串(新建链表)的尾节点  
  148.     if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))  
  149.         return str;                                       //参数不正确时返回空串  
  150.     for(k=0;k<i-1;k++)                                    //将s的前i-1个节点复制到str  
  151.     {  
  152.         q=(LiString *)malloc(sizeof(LiString));  
  153.         q->data=p->data;  
  154.         r->next=q;  
  155.         r=q;  
  156.         p=p->next;  
  157.     }  
  158.     for(k=0;k<j;k++)                                      //p沿next跳j个节点  
  159.         p=p->next;  
  160.     while(p!=NULL)                                        //*p及其后的节点复制到str  
  161.     {  
  162.         q=(LiString *)malloc(sizeof(LiString));  
  163.         q->data=p->data;  
  164.         r->next=q;  
  165.         r=q;  
  166.         p=p->next;  
  167.     }  
  168.     r->next=NULL;  
  169.     return str;  
  170. }  
  171. LiString *RepStr(LiString *s,int i,int j,LiString *t)      //串替换  
  172. {  
  173.     int k;  
  174.     LiString *str,*p=s->next,*p1=t->next,*q,*r;  
  175.     str=(LiString *)malloc(sizeof(LiString));             //构造空的新串  
  176.     str->next=NULL;  
  177.     r=str;                                                //r指向新串(新建链表)的尾节点  
  178.     if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))  
  179.         return str;                                       //参数不正确时返回空串  
  180.     for(k=0;k<i-1;k++)                                    //将s的前i-1个节点复制到str  
  181.     {  
  182.         q=(LiString *)malloc(sizeof(LiString));  
  183.         q->data=p->data;  
  184.         r->next=q;  
  185.         r=q;  
  186.         p=p->next;  
  187.     }  
  188.     for(k=0;k<j;k++)                                      //p沿next跳j个节点  
  189.         p=p->next;  
  190.     while(p1!=NULL)                                       //串t复制到str  
  191.     {  
  192.         q=(LiString *)malloc(sizeof(LiString));  
  193.         q->data=p1->data;  
  194.         r->next=q;  
  195.         r=q;  
  196.         p1=p1->next;  
  197.     }  
  198.     while(p!=NULL)                                        //*p及其后的节点复制到str  
  199.     {  
  200.         q=(LiString *)malloc(sizeof(LiString));  
  201.         q->data=p->data;  
  202.         r->next=q;  
  203.         r=q;  
  204.         p=p->next;  
  205.     }  
  206.     r->next=NULL;  
  207.     return str;  
  208. }  
  209. void DispStr(LiString *s)                                 //输出串  
  210. {  
  211.     LiString *p=s->next;  
  212.     while(p!=NULL)  
  213.     {  
  214.         printf("%c",p->data);  
  215.         p=p->next;  
  216.     }  
  217.     printf("\n");  
  218. }  

main.cpp:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include "listring.h"  
  3. int main()  
  4. {  
  5.     LiString *s,*s1,*s2,*s3,*s4;  
  6.     char objects[]={"abcdefghijklmn"},objects1[]={"123"};   //s.s1作为目标串  
  7.     StrAssign(s,objects);  
  8.     StrAssign(s1,objects1);                                 //建立串s:abcdefghijklmn和串s1:123  
  9.   
  10.     printf("建立的串s为:");                                //输出串s和s1  
  11.     DispStr(s);  
  12.     printf("建立的串s1为:");  
  13.     DispStr(s1);  
  14.     printf("\n");  
  15.   
  16.     printf("串s的长度为:%d\n\n",StrLength(s));             //输出串s的长度  
  17.   
  18.     s2=InsStr(s,9,s1);                                      //在串s的第9个字符位置插入串s1而产生串s2  
  19.     printf("插入操作后串s2为:");  
  20.     DispStr(s2);                                            //输出串s2  
  21.     printf("\n");  
  22.   
  23.     s2=DelStr(s,2,5);                                       //删除串s第2个字符开始的5个字符而产生串s2  
  24.     printf("删除操作后串s2为:");  
  25.     DispStr(s2);                                            //输出串s2  
  26.     printf("\n");  
  27.   
  28.     s2=RepStr(s,2,5,s1);                                    //将串s第2个字符开始的5个字符替换成串s1而产生串s2  
  29.     printf("替换操作后串s2为:");  
  30.     DispStr(s2);                                            //输出串s2  
  31.     printf("\n");  
  32.   
  33.     s3=SubStr(s,2,10);                                      //提取串s的第2个字符开始的10个字符而产生串s3  
  34.     printf("提取操作后串s3为:");  
  35.     DispStr(s3);  
  36.     printf("\n");  
  37.   
  38.     s4=Concat(s1,s2);                                       //将串s1和串s2连接起来而产生串s4  
  39.     printf("连接操作后串s4为:");  
  40.     DispStr(s4);  
  41.   
  42.     return 0;  
  43. }  

运行结果:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准:Go语言的标准非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准:Go语言的标准非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准:Go语言的标准非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值