C語(yǔ)言的堆串操作詳解
一、堆串概念。
與定長(zhǎng)順序穿的存儲(chǔ)結(jié)構(gòu)類(lèi)似,都是用一組地址連續(xù)的存儲(chǔ)單元存儲(chǔ)串的字符序列,不同的是堆串的存儲(chǔ)空間是動(dòng)態(tài)分配的,只要存儲(chǔ)空間分配成功,就不會(huì)擔(dān)心串在插入或者連接時(shí)候出現(xiàn)截?cái)嗟那闆r。
malloc(),free(),realloc() 這三個(gè)函數(shù)用來(lái)對(duì)動(dòng)態(tài)存儲(chǔ)進(jìn)行操作。
二、基本操作。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define false 0
#define true 1
typedef struct {
char *ch; //字符數(shù)組,若是非空則指向起始地址,若為空則NULL
int len; //長(zhǎng)度
}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'){ //確定串長(zhǎng)
i++;
}
s->len=i;
if(s->ch!=NULL){
free(s);
}else{
s->ch=(char *)malloc((s->len+1)*sizeof(char));//0號(hào)單元不用
if(s==NULL){
printf("空間申請(qǐng)失??!");
return false;
}
for( i=1;i<=s->len;i++){ //依次賦值
s->ch[i]=chars[i-1];
}
}
}
//串遍歷
int HSbianli(HString *s){
if(s->len==0){
printf("串空!");
return false;
}else{
int i;
for(i=1;i<=s->len;i++){
printf("%c",s->ch[i]);
}
return true;
}
}
//串插入
int HStrInsert(HString *s,int pos,const HString t){
if(pos<1||pos>s->len){
printf("位置不合法!");
return false;
}
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 false;
}else if(len>=s->len){
printf("非法位置!");
return false;
}else{
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("空間申請(qǐng)失??!");
return false;
}
if(s->len==0){
printf("串空!");
return false;
}else{
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 false;
}else{
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("此時(shí)串s為:");
HSbianli(&s);
printf("\n此時(shí)串s1為:");
HSbianli(&s1);
printf("\n將s1連接到s為:");
HStrCon(&s,s1);
HSbianli(&s);
printf("\n將串s1插入到s串的第二個(gè)位置:");
HStrInsert(&s,2,s1);
HSbianli(&s);
printf("\n再將插入的s1串刪除:");
HStrDelete(&s,2,3);
HSbianli(&s);
printf("\ns1在第二個(gè)元素長(zhǎng)度為2的子串為:");
HStrchild(&s,2,2);
}三、運(yùn)行:

代碼可運(yùn)行。
總結(jié)
到此這篇關(guān)于C語(yǔ)言的堆串操作詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言堆串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt多線(xiàn)程實(shí)現(xiàn)網(wǎng)絡(luò)發(fā)送文件功能
這篇文章主要為大家詳細(xì)介紹了Qt多線(xiàn)程實(shí)現(xiàn)網(wǎng)絡(luò)發(fā)送文件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
基于C++實(shí)現(xiàn)BMI身體質(zhì)量指數(shù)計(jì)算工具
BMI(Body?Mass?Index,身體質(zhì)量指數(shù)),也稱(chēng)為體重指數(shù),是一種常用的衡量成人人體肥胖程度的指標(biāo),本文就來(lái)用C++編寫(xiě)一個(gè)簡(jiǎn)單的BMI計(jì)算工具吧2023-10-10
使用VS Code的開(kāi)發(fā)環(huán)境配置教程圖文詳解
這篇文章主要介紹了使用VS Code的開(kāi)發(fā)環(huán)境配置教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)
下面小編就為大家?guī)?lái)一篇基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11

