首页 > 作文

C语言的堆串操作详解

更新时间:2023-04-05 00:22:32 阅读: 评论:0

目录
一、堆串概念。二、基本操作。三、运行:总结

一、堆串概念。

与定长顺序穿的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间是动态分配的,只要存储空间分配成功,就不会担心串在插入或者连接时候出现截断的情况。

malloc(),free(),realloc() 这三个函数用来对动态存储进行操作。

二、基本操作。

#include<stdio.h>#include<stdlib.h>#include<string.h>#define fal 0#define true 1typedef struct {char *ch;    //字符数组,若是非空则指向起始地址,若为空则null int len;   //长度 }hstring;//初始化int hinit(hstring *s){s->ch=null;s->len=0;} //串赋值int hstrassign(hstring *s,const char *chars){int i=0;while(chars[i]!='
#include<stdio.h>#include<stdlib.h>#include<string.h>#define fal 0#define true 1typedef struct {char *ch;    //字符数组,若是非空则指向起始地址,若为空则null int len;   //长度 }hstring;//初始化int hinit(hstring *s){s->ch=null;s->len=0;} //串赋值int hstrassign(hstring *s,const char *chars){int i=0;while(chars[i]!='\0'){    //确定串长 i++;}s->len=i;if(s->ch!=null){free(s);}el{s->ch=(char *)malloc((s->len+1)*sizeof(char));//0号单元不用if(s==null){printf("空间申请失败!");return fal;} for( i=1;i<=s->len;i++){   //依次赋值 s->ch[i]=chars[i-1];}}}//串遍历int hsbianli(hstring *s){if(s->len==0){printf("串空!");return fal; }el{int i;for(i=1;i<=s->len;i++){printf("%c",s->ch[i]);}return true;}} //串插入int hstrinrt(hstring *s,int pos,const hstring t){if(pos<1||pos>s->len){printf("位置不合法!");return fal;}char *temp;temp=(char *)malloc((s->len+t.len+1) *sizeof(char));int i;for(i=1;i<pos;i++){    //将s串pos之前(不含pos)的字符赋给temp temp[i]=s->ch[i];}for(i=pos;i<pos+t.len;i++){   //将t串的元素赋给s temp[i]=t.ch[i-pos+1];}for(i=0;i<=s->len-pos;i++){temp[pos+t.len+i]=s->ch[i+pos];}free(s->ch);s->ch=temp;s->len=s->len+t.len;return true; } //串删除int hstrdelete(hstring *s,int pos,int len){if(s->len==0){printf("串空!");return fal;}el if(len>=s->len){printf("非法位置!");return fal;}el{for(int i=pos;i<s->len-pos;i++){   //跨度为len的依次赋值 s->ch[i]=s->ch[i+len];}s->len=s->len-len;return true;}} //串连接int hstrcon(hstri爱情的味道ng *s,const hstring t){s->ch=(char *)realloc(s->ch,(s->len+t.len+1) *sizeof(char));if(s==null){printf("空间申请失败!");return fal;}if(s->len==0){printf("串空!");return fal;}el{for(int i=1;i<=t.len;i++){s->ch[i+s->len]=t.ch[i];}s->len=s->len+t.len;return true;}}//求字串int hstrchild(hstring *s,int pos,int len){if(s->len==0){printf("串空!");return fal;}el{for(int i=0;i<len;i++){printf("%c",s->ch[i+pos]);}return true;}}int main(){hstring s;hstring s1;hinit(&s);hinit(&s1);char a[]={"aaaaa"};char b[]={"bbb"};hstrassign(&s,a);hstrassign(&s1,b);printf("-----将aaaaa赋值给s,bbb赋值给s1-----\n");printf("此时串s为:"); hsbianli(&s);printf("\n此时串s1为:"); hsbianli(&s1);printf("\n将s1连接到s为:"); hstrcon(&s,s1);hsbianli(&s); printf("\n将串s1插入到s串的第二个位置:");hstrinrt(&s,2,s1);hsbianli(&s);printf("\n再将插入的s1串删除:");hstrdelete(&s,2,3);hsbianli(&s);printf("\ns1在第二个元素长度为2的子串为:");hstrchild(&s,2,2);}
'){ //确定串长 i++;}s->len=i;if(s->ch!=null){free(s);}el{s->ch=(char *)malloc((s->len+1)*sizeof(char));//0号单元不用if(s==null){printf("空间申请失败!");return fal;} for( i=1;i<=s->len;i++){ //依次赋值 s->ch[i]=chars[i-1];}}}//串遍历int hsbianli(hstring *s){if(s->len==0){printf("串空!");return fal; }el{int i;for(i=1;i<=s->len;i++){printf("%c",s->ch[i]);}return true;}} /廓尔喀/串插入int hstrinrt(hstring *s,int pos,const hstring t){if(pos<1||pos>s->len){printf("位置不合法!");return国产越野车 fal;}char *temp;temp=(char *)malloc((s->len+t.len+1) *sizeof(char));int i;for(i=1;i<pos;i++){ //将s串pos之前(不含pos)的字符赋给temp temp[i]=s->ch[i];}for(i=pos;i<pos+t.len;i++){ //将t串的元素赋给s temp[i]=t.ch[i-pos+1];}for(i=0;i<=s->len-pos;i++){temp[pos+t.len+i]=s->ch[i+pos];}free(s->ch);s->ch=temp;s->len=s->len+t.len;return true; } //串删除int hstrdelete(hstring *s,int pos,int len){if(s->len==0){printf("串空!");return fal;}el if(len>=s->len){printf("非法位置!");return fal;}el{for(int i=pos;i<s->len-pos;i++){ //跨度为len的依次赋值 s->ch[i]=s->ch[i+len];}s->len=s->len-len;return true;}} //串连接 int hstrcon(hstring *s,const hstring t){ s->ch=(char *)realloc(s->ch,(s->len+t.len+1) *sizeof(char)); if(s==null){ printf("空间申请失败!"); return fal; }if(s->len==0){printf("串空!我最欣赏的一个人");return fal;}el{for(int i=1;i<=t.len;i++){s->ch[i+s->len]=t.ch[i];}s->len=s->len+t.len;return true;} } //求字串 int hstrchild(hstring *s,int pos,int len){ if(s->len==0){ printf("串空!"); return fal; }el{ for(int i=0;i<len;i++){ printf("%c",s->ch[i+pos]); } return true; } } int main(){hstring s;hstring s1;hinit(&s);hinit(&s1);char a[]={"aaaaa"};char b[]={"bbb"};hstrassign(&s,a);hstrassign(上海高考满分作文&s1,b);printf("-----将aaaaa赋值给s,bbb赋值给s1-----\n");printf("此时串s为:"); hsbianli(&s);printf("\n此时串s1为:"); hsbianli(&s1);printf("\n将s1连接到s为:"); hstrcon(&s,s1); hsbianli(&s); printf("\n将串s1插入到s串的第二个位置:");hstrinrt(&s,2,s1);hsbianli(&s);printf("\n再将插入的s1串删除:");hstrdelete(&s,2,3);hsbianli(&s);printf("\ns1在第二个元素长度为2的子串为:");hstrchild(&s,2,2);}

三、运行:

代码可运行。

总结

到此这篇关于c语言的堆串操作详解的文章就介绍到这了,更多相关c语言堆串内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-05 00:22:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/6684db717714377f71fd435daf29a537.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C语言的堆串操作详解.doc

本文 PDF 下载地址:C语言的堆串操作详解.pdf

标签:赋值   第二个   位置   字符
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图