C語言的堆串操作詳解
一、堆串概念。
與定長順序穿的存儲結(jié)構(gòu)類似,都是用一組地址連續(xù)的存儲單元存儲串的字符序列,不同的是堆串的存儲空間是動態(tài)分配的,只要存儲空間分配成功,就不會擔(dān)心串在插入或者連接時候出現(xiàn)截斷的情況。
malloc(),free(),realloc() 這三個函數(shù)用來對動態(tài)存儲進(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; //長度
}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);
}else{
s->ch=(char *)malloc((s->len+1)*sizeof(char));//0號單元不用
if(s==NULL){
printf("空間申請失敗!");
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("空間申請失敗!");
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("此時串s為:");
HSbianli(&s);
printf("\n此時串s1為:");
HSbianli(&s1);
printf("\n將s1連接到s為:");
HStrCon(&s,s1);
HSbianli(&s);
printf("\n將串s1插入到s串的第二個位置:");
HStrInsert(&s,2,s1);
HSbianli(&s);
printf("\n再將插入的s1串刪除:");
HStrDelete(&s,2,3);
HSbianli(&s);
printf("\ns1在第二個元素長度為2的子串為:");
HStrchild(&s,2,2);
}三、運(yùn)行:

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

