国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言實現數據結構串(堆分配存儲表示法)實例詳解

2020-01-26 14:01:40
字體:
來源:轉載
供稿:網友

堆分配存儲表示法

存儲結構:

構建堆來存儲字符串,本質上是順序表

實現代碼:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -2#define STR_INIT_SIZE 100#define STRINCREMENT 10typedef int Status;typedef struct{  char *ch; //空串時指向NULL,非空串時按串長分配存儲區  int length;} HString;Status InitString(HString *T) //初始化字符串{  //指針指向NULL,長度為0即可  //p.s.申請內存空間的過程在賦值中完成  T->ch = NULL;  T->length = 0;  return OK;}Status StrAssign(HString *T, char *p) //字符串賦值{  //1.判斷T是否已有內容,有則釋放  //2.判斷賦值的內容是否為空,為空則不賦值  //3.根據長度向內存申請空間,遍歷賦值給T,長度等于字符串長度  //p.s.在這里賦值不賦/0,在打印時通過長度來判斷字符串結尾  int i, len = strlen(p);  if (T->ch)    free(T->ch);  if (!len)  {    T->ch = NULL;    T->length = 0;    return ERROR;  }  else  {    T->ch = (char *)malloc(len * sizeof(char));    if(!T->ch)      exit(OVERFLOW);    for (i = 0; i < len; ++i)      T->ch[i] = p[i];    T->length = len;    return OK;  }}Status StrPrint(HString T) //打印字符串{  //通過長度判斷打印的字符數  int i;  for (i = 0; i < T.length; ++i)    printf("%c", T.ch[i]);  printf("/n");}Status StrLength(HString T) //字符串長度{  return T.length;}Status StrEmpty(HString T) //字符串判空{  if (T.length == 0)    return TRUE;  else    return FALSE;}Status Concat(HString *T, HString S1, HString S2) //字符串聯接{  //1.申請長度為S1和S2之和的字符串空間  //2.先將S1的元素逐個賦值到T中  //3.再將S2的元素逐個賦值到T中  int i;  if (T->ch)    free(T->ch);  T->ch = (char *)malloc((S1.length + S2.length) * sizeof(char));  if (!T->ch)    exit(OVERFLOW);  for (i = 0; i < S1.length; ++i)    T->ch[i] = S1.ch[i];  for (i = 0; i < S2.length; ++i)    T->ch[i + S1.length] = S2.ch[i];  T->length = S1.length + S2.length;  return OK;}Status StrDelete(HString *T, int pos, int len) //刪除字符串中某個位置固定長度的子串{  //pos是字符串中的位置,刪除包括pos的len長度  int i;  if (pos >= T->length)    return ERROR;  else if(pos + len > T->length)    len = T->length - pos + 1;  for (i = pos - 1; i < T->length - len; ++i)    T->ch[i] = T->ch[i + len];  T->length -= len;  T->ch = (char *)realloc(T->ch, T->length * sizeof(char));  if (!T->ch)    exit(OVERFLOW);  return OK;}Status StrInsert(HString *S, int pos, HString T){  //pos是字符串中的位置,插入時原來的元素(包括pos位)后移  int i, len;  --pos;  len = StrLength(T);  S->ch = (char *)realloc(S->ch, (S->length + len) * sizeof(char));  if (pos > S->length)    pos = S->length;  for (i = S->length - 1; i > pos - 1; --i)    S->ch[i + len] = S->ch[i];  for (i = 0; i < len; ++i)    S->ch[i + pos] = T.ch[i];  S->length += len;  if (!S->ch)    exit(OVERFLOW);  return OK;}Status Index(HString S, HString T, int pos) //在字符串S中索引位置pos之后的子串t{  //同定長順序存儲表示法  //p.s.傳入的pos是字符串的位置,從1開始  //p.s.初始狀態下T為非空串  if (StrEmpty(T))    return ERROR;  int i = pos - 1, j = 0;  while(i < S.length && j < T.length)  {    if (S.ch[i] == T.ch[j])    {      ++i;      ++j;    }    else    {      i = i - j + 1;      j = 0;    }  }  if (j >= T.length)    return i - j + 1;  else    return 0;}Status Replace(HString *T, HString S1, HString S2) //將字符串T中等于S1的子串替換成為S2{  //循環索引子串S1在字符串T中的位置(每次的位置從上一次位置后開始查找)  //從查找到的位置-1開始替換  //p.s.初始狀態下S1為非空串  int pos = 0;  if (StrEmpty(S1))    return ERROR;  //當pos存在時循環,當全部索引完畢后pos為0  //將索引到的該位置對應的子串刪除后再插入新的子串  do  {    pos = Index(*T, S1, pos);    if (pos)    {      StrDelete(T, pos, StrLength(S1));      StrInsert(T, pos, S2);    }  }  while(pos);  return OK;}Status SubString(HString *Sub, HString S, int pos, int len){  int i;  if (pos < 1 || len > S.length || len < 0 || len > S.length - pos + 1)    exit(OVERFLOW);  if (Sub->ch)    free(Sub->ch);  //如果查詢的長度為0,則子串置空  if (len == 0)  {    Sub->ch = NULL;    Sub->length = 0;  }  else  {    Sub->ch = (char *)malloc(len * sizeof(char));    for (i = 0; i < len; ++i)      Sub->ch[i] = S.ch[pos + i - 1];    Sub->length = len;  }  return OK;}int main(){  int pos;  HString t, s, r;  char *p = "Hello,String!", *q = "Bye,Bye!";  printf("String *p: %s/n", p);  InitString(&t);  StrAssign(&t, p);  printf("StrAssign... OK./nString t : ");  StrPrint(t);  printf("------------------------------/n");  printf("StrLength... OK./nString Length : %d/n", StrLength(t));  printf("StrEmpty... OK./n");  if (StrEmpty(t))    printf("String is Empty./n");  else    printf("String is not Empty./n");  printf("------------------------------/n");  InitString(&s);  StrAssign(&s, q);  printf("String s : ");  StrPrint(s);  printf("------------------------------/n");  InitString(&r);  Concat(&r, t, s);  printf("Concat... OK./n");  printf("String r : ");  StrPrint(r);  printf("------------------------------/n");  printf("StrDelete... OK./n");  StrDelete(&r, 14, 4);  printf("String r : ");  StrPrint(r);  printf("------------------------------/n");  printf("StrInsert... OK./n");  StrAssign(&t, "Bye,Bye,Bye!");  StrInsert(&r, 14, t);  printf("String r : ");  StrPrint(r);  printf("------------------------------/n");  StrAssign(&t, "ye");  printf("Index... ");  StrPrint(t);  pos = 1;  while(pos)  {    pos = Index(r, t, pos + 1);    if (!pos)      break;    printf("Position : %d/n", pos);  }  printf("------------------------------/n");  StrAssign(&t, "ye");  StrAssign(&s, "oo");  Replace(&r, t, s);  printf("Replace ye -> ooo ... OK./n");  printf("String r : ");  StrPrint(r);  printf("------------------------------/n");  SubString(&t, r, 7, 4);  printf("SubString... OK./n");  printf("String SubString : ");  StrPrint(t);  printf("------------------------------/n");  return OK;}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 永康市| 潞西市| 扶绥县| 仙桃市| 清徐县| 湖州市| 厦门市| 屏边| 灵丘县| 巍山| 长治县| 阳朔县| 乌鲁木齐县| 车险| 宜川县| 都江堰市| 汉源县| 延庆县| 利川市| 榆社县| 南皮县| 镇巴县| 东港市| 赫章县| 津市市| 高雄市| 永顺县| 塔城市| 高陵县| 宁津县| 布拖县| 杭锦旗| 彰化县| 石狮市| 文成县| 莫力| 喀喇沁旗| 西林县| 永和县| 尉犁县| 荥阳市|