/* * 动态分配存储的顺序表 */ #include <stdio.h> #include <stdlib.h> #define INIT_SIZE 100 #define EXPAND_SIZE 50 typedef int ElemType; typedef struct { ElemType *head; int len; // 顺序表当前元素个数 int size; // 顺序表当前最大容量 } Sqlist; int init_sqlist(Sqlist *list) { if( (list->head = malloc(INIT_SIZE*sizeof(ElemType))) == NULL ) // 分配初始空间 { printf("init error. "); return -1; } list->len = 0; list->size = INIT_SIZE; return 0; } int insert_sqlist(Sqlist *list, int n, ElemType item) { ElemType *t; if( n > list->len+1 || n < 1 ) // 插入位置非法 { printf("insert error, location illegal. "); return -1; } if( list->len == list->size ) // 顺序表当前容量已经全部用完, 扩容 { t = realloc( list->head, (list->size + EXPAND_SIZE)*sizeof(ElemType) ); if( t == NULL) { printf("realloc error. "); return -1; } list->head = t; list->size += EXPAND_SIZE; } for( t = list->head + list->len ; t > (list->head + (n-1)) ; t-- ) // 原第n位置元素及其后的元素依次后移 *t = *(t-1); *t = item; list->len ++; return 0; } int delete_sqlist(Sqlist *list, int n) { ElemType *t; if( n > list->len || n < 1 ) // 删除位置非法 { printf("delete error, location illegal. "); return -1; } for( t= list->head + (n-1) ; t < list->head + (list->len-1) ; t++ ) // 第n+1位置元素及其后的元素依次前移 *t = *(t+1); list->len --; return 0; } int free_sqlist(Sqlist *list) { free(list->head); return 0; } void print_sqlist(Sqlist list) { int i; for(i=0; i<list.len; i++) printf("%d ", list.head[i]); printf(" "); } int main(void) { Sqlist list; init_sqlist(&list); int i; for( i=1 ; i<=117; i++) insert_sqlist(&list,i,i); print_sqlist(list); delete_sqlist(&list, 5); delete_sqlist(&list, 115); print_sqlist(list); free_sqlist(&list); return 0; }