C語言的堆串操作詳解
更新時間:2022年02月13日 14:52:42 作者:犀牛超人
大家好,本篇文章主要講的是C語言的堆串操作詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
一、堆串概念。
與定長順序穿的存儲結構類似,都是用一組地址連續(xù)的存儲單元存儲串的字符序列,不同的是堆串的存儲空間是動態(tài)分配的,只要存儲空間分配成功,就不會擔心串在插入或者連接時候出現(xiàn)截斷的情況。
malloc(),free(),realloc() 這三個函數(shù)用來對動態(tài)存儲進行操作。
二、基本操作。
#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);
}三、運行:

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

