不定长顺序表的数据结构以及方法的定义
#ifndef _SEQ_LIST_H_
#define _SEQ_LIST_H_
#include <stdlib.h>
typedef int elem_type;
typedef struct _SEQ_LIST
{
elem_type *data; //指针指向顺序堆空间
int len; //顺序表中有len个元素
int total; //顺序表总大小
}SEQ_LIST;
#define ERROR -1
SEQ_LIST *init_seq_list(int size);
bool destory_seq_list(SEQ_LIST *p);
bool insert_tail(SEQ_LIST *p, elem_type e);
bool insert_head(SEQ_LIST *p, elem_type e);
bool insert(SEQ_LIST *p,int pos, elem_type e);
bool is_full(SEQ_LIST *p);
void pfunc(void *p);
//##########################//
bool clear_seq_list(SEQ_LIST *p);
bool is_empty(SEQ_LIST *p);
int get_length(SEQ_LIST *p);
bool del_tail(SEQ_LIST *p, elem_type *e);
bool del_head(SEQ_LIST *p, elem_type *e);
bool get(SEQ_LIST *p, int pos, elem_type *e);
bool put(SEQ_LIST *p, int pos, elem_type e);
bool del(SEQ_LIST *p,int pos, elem_type *e);
////
int search(SEQ_LIST *p,elem_type e);///
bool show(SEQ_LIST *p, void (*pfunc)(void *));
////
SEQ_LIST *clone(SEQ_LIST *p);
bool remove_range(SEQ_LIST *p, int start, int end);
SEQ_LIST *sub_seq_list(SEQ_LIST *p, int start ,int end);
SEQ_LIST *insert_elem(SEQ_LIST *p,elem_type *e);
SEQ_LIST *reverse(SEQ_LIST *p);
SEQ_LIST *del_repeat_elem(SEQ_LIST *p,SEQ_LIST *s);
SEQ_LIST *combine(SEQ_LIST *p,SEQ_LIST *s,SEQ_LIST *c);
SEQ_LIST *combine_ea(SEQ_LIST *p,SEQ_LIST *s);
#endif
1 #include"SEQ_LIST.h" 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 int e = 0; 6 static bool inc(SEQ_LIST *p)//内部函数,本文件内可见 7 { 8 if(p == NULL) 9 { 10 return false; 11 } 12 // 13 printf("%d-%d\n",p->total,p->total*2); 14 p->data = (elem_type *)realloc(p->data,p->total*2*sizeof(elem_type));//1024-int 15 p->total = 2*p->total; 16 17 return true; 18 } 19 20 SEQ_LIST *init_seq_list(int size) 21 { 22 SEQ_LIST *p = (SEQ_LIST *)malloc(sizeof(SEQ_LIST) * 1); 23 if (p == NULL) 24 { 25 return NULL; 26 } 27 p->data = (elem_type *)malloc(sizeof(elem_type) * size); 28 if (p->data == NULL) 29 { 30 return NULL; 31 } 32 33 p->len = 0; 34 p->total = size; 35 36 return p; 37 } 38 /* 39 bool init_seq_list(SEQ_LIST *s1,int m) 40 { 41 if(s1==NULL) 42 { 43 return false; 44 } 45 elem_type *p = (elem_type *)malloc(sizeof(elem_type)* m); 46 p = s1->data; 47 s1->len = 0; 48 return true; 49 50 }*/ 51 52 bool destory_seq_list(SEQ_LIST *p) 53 { 54 if(p==NULL) 55 { 56 return false; 57 } 58 free(p->data); 59 free(p); 60 return true; 61 } 62 63 bool clear_seq_list(SEQ_LIST *p) 64 { 65 if(p == NULL) 66 { 67 return false; 68 } 69 p->len = 0; 70 return true; 71 72 } 73 74 bool is_full(SEQ_LIST *p) 75 { 76 if(p==NULL) 77 { 78 return false; 79 } 80 81 return p->len == p->total ; 82 83 } 84 85 bool is_empty(SEQ_LIST *p) 86 { 87 if (p == NULL) 88 { 89 return false; 90 } 91 92 return p->len == 0; 93 94 } 95 96 int get_length(SEQ_LIST *p) 97 { 98 if(p==NULL) 99 { 100 return false; 101 } 102 return p->len ; 103 } 104 105 bool insert_tail(SEQ_LIST *p, elem_type e) 106 { 107 if(p==NULL) 108 { 109 return false; 110 } 111 if(is_full(p)) 112 { 113 inc(p); 114 printf("增加空间成功\n"); 115 } 116 p->data[p->len ++] = e; 117 return true; 118 119 } 120 121 bool insert_head(SEQ_LIST *p, elem_type e) 122 { 123 if(p==NULL) 124 { 125 return false; 126 } 127 if(is_full(p)) 128 { 129 inc(p); 130 } 131 p->len ++; 132 for(int i =p->len;i>0;i--) 133 { 134 p->data[i] = p->data[i-1]; 135 } 136 p->data[0] = e; 137 return true; 138 } 139 140 bool insert(SEQ_LIST *p,int pos, elem_type e) 141 { 142 if(p==NULL) 143 { 144 return false; 145 } 146 if(is_full(p)) 147 { 148 inc(p); 149 } 150 151 for(int i = p->len -1;i>=pos;i--) 152 { 153 p->data [i] = p->data[i-1]; 154 } 155 p->data [pos] = e; 156 return true; 157 158 } 159 160 bool del_tail(SEQ_LIST *p, elem_type *e) 161 { 162 if(p==NULL) 163 { 164 return false; 165 } 166 if(is_empty(p)) 167 { 168 return false; 169 } 170 *e = p->data[--p->len]; 171 return true; 172 } 173 bool del_head(SEQ_LIST *p, elem_type *e) 174 { 175 if(p==NULL) 176 { 177 return false; 178 } 179 if(is_empty(p)) 180 { 181 return false; 182 } 183 *e = p->data[0]; 184 for(int i = 0;i<p->data [p->len];i++) 185 { 186 p->data [i] = p->data[i+1]; 187 } 188 p->len --; 189 return true; 190 } 191 192 bool get(SEQ_LIST *p, int pos, elem_type *e) 193 { 194 if(p==NULL) 195 { 196 return false; 197 } 198 if(!(pos>=0 && pos<=p->len )) 199 { 200 return false; 201 } 202 *e = p->data [pos]; 203 return true; 204 205 206 } 207 bool put(SEQ_LIST *p, int pos, elem_type *e) 208 { 209 if(p==NULL) 210 { 211 return false; 212 } 213 if(!(pos>=0 && pos<=p->len )) 214 { 215 return false; 216 } 217 p->data [pos] = *e; 218 return true; 219 220 } 221 222 bool del(SEQ_LIST *p,int pos, elem_type *e) 223 { 224 if(p==NULL) 225 { 226 return false; 227 } 228 if (is_empty(p)) 229 { 230 return false; 231 } 232 *e = p->data [pos]; 233 for(int i = pos;i<p->len ;i++) 234 { 235 p->data [i] = p->data [i+1]; 236 } 237 p->len --; 238 return true; 239 240 241 } 242 243 int search(SEQ_LIST *p,elem_type e) 244 { 245 if(p==NULL) 246 { 247 return ERROR; 248 } 249 if(is_empty(p)) 250 { 251 return ERROR; 252 } 253 for(int i = 0;i<p->len ;i++) 254 { 255 if(p->data[i] == e) 256 { 257 return i; 258 259 } 260 } 261 } 262 263 264 bool show(SEQ_LIST *p, void (*pfunc)(void *)) 265 { 266 if(p==NULL) 267 { 268 return false; 269 } 270 if(is_empty(p)) 271 { 272 return false; 273 } 274 275 for (int i=0;i<p->len;i++) 276 { 277 pfunc(&p->data[i]); 278 } 279 printf("\n"); 280 printf("%d %d\n",p->len ,p->total ); 281 return true; 282 283 } 284 285 bool sort(SEQ_LIST *p) 286 { 287 if(p == NULL) 288 { 289 return false; 290 } 291 if(is_empty(p)) 292 { 293 return false; 294 } 295 296 elem_type tmp = 0; 297 for(int i = 0;i< p->len-1;i++) 298 { 299 for(int j=0;j<p->len -1-i;j++) 300 { 301 if(p->data[j]>p->data[j+1]) 302 { 303 tmp = p->data[j]; 304 p->data[i] = p->data[i+1]; 305 p->data[i+1] = tmp; 306 } 307 308 } 309 310 } 311 return true ; 312 } 313 314 SEQ_LIST *clone(SEQ_LIST *p) 315 { 316 if(p==NULL) 317 { 318 return NULL; 319 } 320 321 SEQ_LIST *s = init_seq_list(p->total); 322 s->len = 0; 323 if(is_empty(p)) 324 { 325 return s; 326 } 327 328 for(int i= 0;i<p->len ;i++) 329 { 330 s->data[i] = p->data[i]; 331 s->len++; 332 } 333 return s; 334 335 } 336 337 bool remove_range(SEQ_LIST *p, int start, int end) 338 { 339 if(p=NULL) 340 { 341 return false; 342 } 343 if(is_empty(p)) 344 { 345 return false; 346 } 347 348 for(int i=start;i<end;i++) 349 { 350 del(p,i,&e); 351 352 } 353 return true; 354 } 355 356 SEQ_LIST *sub_seq_list(SEQ_LIST *p, int start ,int end) 357 { 358 if(p==NULL) 359 { 360 return NULL; 361 } 362 if(is_empty(p)) 363 { 364 return NULL; 365 } 366 SEQ_LIST *s = init_seq_list(end - start); 367 p->len = 0; 368 for(int i=start,j=0;i<=end,j<(end - start);i++,j++) 369 { 370 s->data[j] = p->data[start]; 371 s->len ++; 372 } 373 return s; 374 375 376 } 377 378 379 //设顺序表va中的数据元素递增有序。 380 //试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。 381 SEQ_LIST *insert_elem(SEQ_LIST *p,elem_type *e) 382 { 383 if(p==NULL) 384 { 385 return NULL; 386 } 387 if(is_empty(p)) 388 { 389 return NULL; 390 } 391 if(is_full(p)) 392 { 393 inc(p); 394 } 395 int rs = 0; 396 for(int i =0;i<p->len ;i++) 397 { 398 if(*e >= p->data[i] && *e <= p->data[i+1]) 399 { 400 rs = i; 401 } 402 } 403 for(int j = p->len -1;j >= rs;j--) 404 { 405 p->data[j+1] = p->data[j]; 406 } 407 p->data[rs] = *e; 408 return p; 409 410 } 411 412 //试写一算法,实现顺序表的就地逆置, 413 //即利用原表的存储空间将线性表逆置为。 414 SEQ_LIST *reverse(SEQ_LIST *p) 415 { 416 if(p==NULL) 417 { 418 return NULL; 419 } 420 if(is_empty(p)) 421 { 422 return NULL; 423 } 424 elem_type tmp = 0; 425 for(int i = 0,j=p->len ;i<j;i++,j--) 426 { 427 tmp = p->data [i]; 428 p->data[i] = p->data[j]; 429 p->data[j] = tmp; 430 431 } 432 return p; 433 } 434 435 //利用顺序表的基本运算,实现如果在顺序表A中出现的元素, 436 //在顺序表B中也出现,则将A中该元素删除。 437 SEQ_LIST *del_repeat_elem(SEQ_LIST *p,SEQ_LIST *s) 438 { 439 if( p == NULL || s==NULL) 440 { 441 return NULL; 442 } 443 if(is_empty(p) || is_empty(s)) 444 { 445 return p; 446 } 447 for(int i= 0;i<p->len ;i++) 448 { 449 for(int j = 0;j<s->len;s++) 450 { 451 if(p->data[i] == s->data[j]) 452 { 453 del(p,i,&e); 454 } 455 } 456 } 457 return p; 458 } 459 460 461 //顺序表A和顺序表B的元素都是非递减排列, 462 //利用线性表的基本运算,将它们合并成一个顺序表C, 463 //要求C也是非递减排列。例如,A=(6,11,11,23) 464 //B=(2,10,12,12,21),则C=(2,6,10,11,11,12,12,21,23) 465 466 SEQ_LIST *combine(SEQ_LIST *p,SEQ_LIST *s) 467 { 468 if(p==NULL || s==NULL) 469 { 470 return NULL; 471 } 472 SEQ_LIST *c = init_seq_list(p->len + s->len ); 473 474 if(c==NULL) 475 { 476 return NULL; 477 } 478 for(int i = 0;i<p->len ;i++) 479 { 480 c->data[i] = p->data[i]; 481 } 482 for(int j = 0 ;j<s->len ;j++) 483 { 484 c->data[j + p->len ] = s->data[j]; 485 } 486 //sort(c); 487 return c; 488 } 489 490 SEQ_LIST *combine_ea(SEQ_LIST *p,SEQ_LIST *s) 491 { 492 if(p==NULL || s==NULL ) 493 { 494 return NULL; 495 } 496 SEQ_LIST *c = init_seq_list(p->len + s->len ); 497 if(c==NULL) 498 { 499 return NULL; 500 } 501 for(int i = 0;i<p->len ;i++) 502 { 503 for(int j=0;j<s->len ;j++) 504 { 505 if(p->data[i]<= s->data[j]) 506 { 507 c->data[i] = p->data[i]; 508 c->len ++; 509 break; 510 } 511 else 512 { 513 c->data [i] = s->data [i]; 514 c->len ++; 515 } 516 517 } 518 return c; 519 } 520 521 }
具体方法的实现