标签:bsp 顺序 ora 解决 方式 很多 元素 结构体 incr
线性表是n个数据元素的有限序列。根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的)。
在C语言中,线性表通过结构体的方式来实现。结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量。操作包含在指定位置插入某一元素、删除指定元素、查找指定的元素等。在这里重点介绍插入和删除算法。
下面就是关于这一部分内容的陈述。
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType;
typedef struct{ ElemType *elem; int length; int listsize; }SqList;
Status InitList_Sq(SqList &L){ L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//malloc函数为分配一个内存空间 if(!L.elem) exit(OVERFLOW);//存储分配失败 L.length=0;//空表的长度为零 L.listsize=LIST_INIT_SIZE;//设置初始分配容量 return OK; }
Status ListInsert_Sq(Sqlist *L, int i, ElemType e) { //在顺序线性表L中第i个位置之前插入新的元素e //i的合法值为1<=i<=ListLength_Sq(L) + 1 ElemType *newbase, *q, *p; if(i < 1 || i > L->length + 1) return ERROR;//i值不合法 if(L->length >= L->listsize) //当前存储空间已满,增加分配 { newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType)); if(!newbase) return ERROR; //分配失败 L->elem = newbase; //新基址 L->listsize += LISTINCREMENT; //增加存储容量 } q = &L->elem[i-1]; //q为插入位置 for(p = &L->elem[L->length-1]; p >= q; --p) *(p+1) = *p; //插入位置及之后的元素后移 *q = e; //插入e L->length++; //表增长1 return OK; }//ListInsert_Sq
Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e) { //在顺序线性表L中删除第i个元素,并用e返回其值 //i的合法值为1<=i<=ListLength_Sq(L) ElemType *p, *q; if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法 p = &L->elem[i-1]; //p为被删除元素的位置 *e = *p; //被删除元素的值赋给e q = &L->elem[i] + L->length - 1;//表尾元素的位置 for(++p; p <= q; p++) //++p为要移动元素的第一个 *(p-1) = *p; //元素左移 L->length--; //表长减一 return OK; }//ListDelete_Sq
从顺序表的插入和删除算法可以看出,顺序表的插入和删除操作是通过数据元素的移动来实现的,因此,线性表的插入和删除的算法时间复杂度都是O(n).此外,顺序表还要求系统分配连续的存储空间,这就给存储空间的分配提出了更高的要求,而且也容易造成存储空间的利用率不高等问题。正是由于顺序表种种的不方便,所以才引入了链表,链表的出现解决了很多顺序表解决不了的问题,最明显的变化就是元素存储空间不需要连续。当然,这需要借助指针来实现,这就引入了新的问题。总体而言,顺序表和链表各有优缺点,在选择时,要根据实际情况选择更加适合的数据结构。
标签:bsp 顺序 ora 解决 方式 很多 元素 结构体 incr
原文地址:https://www.cnblogs.com/freeurmind/p/9911233.html