首页 > 代码库 > 动态分配存储的顺序表

动态分配存储的顺序表

/* * 动态分配存储的顺序表 */#include <stdio.h>#include <stdlib.h>#define INIT_SIZE 100#define EXPAND_SIZE 50typedef 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.\n");        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.\n");        return -1;    }    if( list->len == list->size ) // 顺序表当前容量已经全部用完, 扩容    {        t = realloc( list->head, (list->size + EXPAND_SIZE)*sizeof(ElemType) );        if( t == NULL)        {            printf("realloc error.\n");            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.\n");        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("\n");}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;}