临近期末,学了一学期数据结构,在本学期最后一段时间,写写博客,总结一下这学期都学到了什么!
顺序表有3个优点:
(1)方法简单,各种高级语言中都有数组,容易实现。
(2)不用为表示节点间的逻辑关系而增加额外的存储开销,存储密度大。
(3)顺序表具有按元素序号随机访问的特点,查找速度快,时间复杂度小。
顺序表也有2个缺点:
(1)插入删除操作,平均移动大约表中一半的元素,因此对元素较多的顺序表执行效率低。
(2)需要预先分配存储空间,过大则容易浪费,过小又容易溢出。
来看一下顺序表的存储结构:
#define MAX_SIZE 100 //线性表最大容量
typedef char ElemType;typedef struct{ ElemType *elem; int length; //当前表长 int listsize; //顺序表的最大容量}SqList;//初始化顺序表:int InitList_Sq(SqList *L){ //成功返回1,失败返回0 L.elem = (ElemType*)malloc(MAX_SIZE*sizeof(ElemType)); if(!L.elem) return 0; //分配存储空间失败 L.length = 0; L.listsize = MAX_SIZE; return 1;}//插入操作:int ListInsert_Sq(SqList *L, int i, ElemType e){ if(i < 1 || i > L.ength+1) return 0; //i值不合法 if(L.length >= L.listsize){ //当前存储空间已满,增加分配10个存储空间 ElemType *newbase = (ElemType*)realloc(L.elem, (L.listsize+10)*sizeof(ElemType)); if(!newbase) return 0; L.elem = newbase; L.listsize += 10; } ElemType *q = L.elem[i-1]; //q为插入位置 ElemType *p = L.elem[L.length-1]; for(; p >= q; --p) *(p + 1) = *p; //插入元素之后的元素右移 *q = e; ++L.length; return 1; //插入成功返回1 }//删除操作int List_delete_Sq(SqList *L, int i){ if(i < 1 || i > L.ength+1) return 0; //i值不合法 ElemType *q = L.elem[i-1]; //q为删除位置 ElemType *p = L.elem[L.length-1]; for(; p >= q; --p) *(p - 1) = *p; //删除元素之后的元素左移 --L.length; return 1; //删除成功返回1 }