堆串

2021/12/17 23:28:24

本文主要是介绍堆串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 
  5 typedef struct
  6 {
  7     char* ch;
  8     int len;
  9 }HString;
 10 
 11 void Assign(HString* A, const char* a);//赋值串
 12 void Put(HString* A);
 13 void Insert(HString* A, int pos, const HString B);
 14 void Delete(HString* A, int pos, int len);
 15 void Cat(HString* A, const HString B);
 16 void Sub(HString* A, int pos, int len, HString* B);
 17 
 18 int main(void)
 19 {
 20     int pos;//插入位置
 21     int len;
 22     HString A = { NULL, 0 };
 23     HString B = { NULL, 0 };
 24     char a[] = "hello world!";
 25     char b[] = "hi!";
 26 
 27     Assign(&A, a);
 28     Assign(&B, b);
 29     Put(&A);
 30     Put(&B);
 31 
 32     printf("请输入要插入的位置\n");
 33     scanf("%d", &pos);
 34     Insert(&A, pos, B);
 35     Put(&A);
 36 
 37     printf("\n请输入要删除的位置和长度(逗号分隔)\n");
 38     scanf("%d,%d", &pos, &len);
 39     Delete(&A, pos, len);
 40     Put(&A);
 41 
 42     printf("\n正在连接A和B\n");
 43     Cat(&A, B);
 44     Put(&A);
 45     
 46     printf("\n请输入子串在主串的位置和长度(逗号分隔)\n");
 47     scanf("%d,%d", &pos, &len);
 48     Sub(&A, pos, len, &B);
 49     Put(&B);
 50 
 51     system("pause");
 52     return 0;
 53 }
 54 
 55 void Assign(HString* A, const char* a)
 56 {
 57     int i = 0;
 58     while (a[i] != '\0')
 59     {
 60         i++;
 61     }
 62     A->len = i;//串A的长度等于串a的长度
 63     if (A->len != 0)
 64     {
 65         if (A->ch != NULL)
 66         {
 67             free(A->ch);
 68         }
 69         if (NULL == (A->ch = (char*)calloc(A->len, sizeof(char))))//空间开辟失败
 70         {
 71             printf("\nclear and allocation fail !\n");
 72                 exit(-1);
 73         }
 74         for (i = 0; i < A->len; i++)
 75         {
 76             A->ch[i] = a[i];
 77         }
 78     }
 79     else//当串A长度为0时,串A为空串
 80     {
 81         A->ch = NULL;
 82     }
 83 }
 84 
 85 void Put(HString* A)
 86 {
 87     int i;
 88     printf("串值为:");
 89     for (i = 0; i < A->len; i++)
 90     {
 91         printf("%c", A->ch[i]);
 92     }
 93     printf("\n");
 94 }
 95 
 96 void Insert(HString* A, int pos, const HString B)
 97 {
 98     int i;
 99     char* temp;
100     if (pos < 0 || pos > A->len + 1)
101     {
102         printf("\n插入位置不合法!\n");
103         exit(-1);
104     }
105     pos = pos - 1;//数组下标从0开始
106     if (NULL == (temp = (char*)calloc(A->len + B.len, sizeof(char))))
107     {
108         printf("\nclean and callocation fail !\n");
109         exit(-1);
110     }
111     for (i = 0; i < pos; i++)//把A串pos之前的字符赋给temp
112     {
113         temp[i] = A->ch[i];
114     }
115     for (i = pos; i < pos + B.len; i++)//把temp之间部分赋成串B的内容
116     {
117         temp[i] = B.ch[i - pos];
118     }
119     for (i = pos + B.len; i < A->len + B.len; i++)//把原pos之后的内容连接
120     {
121         temp[i] = A->ch[i - B.len];
122     }
123     free(A->ch);
124     A->ch = temp;
125     A->len = A->len + B.len;
126 }
127 
128 void Delete(HString* A, int pos, int len)
129 {
130     int i;
131     char* temp;
132     if (pos < 1 || pos > A->len || len < 1 || len > (A->len - pos + 1))
133     {
134         printf("%d", len);
135         printf("\n删除参数不合法!\n");
136         exit(-1);
137     }
138     pos = pos - 1;
139     if (NULL == (temp = (char*)calloc(A->len - len, sizeof(char*))))
140     {
141         printf("\nclean and callocation fail !\n");
142         exit(-1);
143     }
144     for (i = 0; i < pos; i++)//把A串pos之前的字符复制给temp
145     {
146         temp[i] = A->ch[i];
147     }
148     for (i = pos; i < A->len - len; i++)//把A串删除部分字符后,剩余部分字符复制给temp
149     {
150         temp[i] = A->ch[i + len];
151     }
152     free(A->ch);
153     A->ch = temp;
154     A->len = A->len - len;
155 }
156 
157 void Cat(HString* A, const HString B)
158 {
159     int i;
160     if (NULL == (A->ch = (char*)realloc(A->ch, (A->len + B.len) * sizeof(char))))//函数realloc保留了串A原有的字符内容
161     {
162         printf("\nreset allocation fail !\n");
163         exit(-1);
164     }
165     for (i = A->len; i < A->len + B.len; i++)
166     {
167         A->ch[i] = B.ch[i - A->len];
168     }
169     A->len = A->len + B.len;
170 }
171 
172 void Sub(HString* A, int pos, int len, HString* B)
173 {
174     int i;
175     if (pos < 1 || pos > A->len + 1 || len < 1 || len > A->len - pos + 1)
176     {
177         printf("\n求子串参数不合法!\n");
178         exit(-1);
179     }
180     pos = pos - 1;
181     B->len = 0;
182     if (B->ch != NULL)//清空子串
183     {
184         free(B->ch);
185     }
186     if (NULL == (B->ch = (char*)calloc(len, sizeof(char))))
187     {
188         printf("\nclean and allocation fail !\n");
189         exit(-1);
190     }
191     for (i = pos; i < pos + len; i++)
192     {
193         B->ch[i - pos] = A->ch[i];
194     }
195     B->len = len;
196 }

 



这篇关于堆串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程