1、顺序存储结构的插入与删除:
获得元素操作:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
/*初始条件:顺序线性表L已存在,1<=i<= ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
return ERROR;
*e = L.data(i-1);
return OK;
}
插入操作:
思路:1、如果插入位置不合理,抛出异常;
2、如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
3、从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
4、将要插入元素填入位置i处
5、表长加1
代码:
/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:在L中第i位置之前插入的新数据元素e,L的长度加1*/
Status ListInsert(Sqlist *L,int i,ElemType e)
{
int k;
if(L->length == MAXSIZE) /*顺序线性表已经满*/
return ERROR;
if(i < 1 || i > L->length + 1) /*当i不在范围内时*/
return ERROR;
if(i<=L->length) /*若插入数据位置不在表尾*/
{
for(k=L->length-1;k<=i-1;k--) /*将要插入位置后数据元素向后移动一位*/
L->data[k+1] = L->data[k];
}
L->data[i-1] = e; /*将新元素插入*/
L->length++;
return OK;
}
删除操作:
思路:1、如果删除位置不合理,抛出异常;
2、取出删除元素;
3、从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
4、表长减1
代码:
/*初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e的返回其值,L的长度减1*/
Status ListDelete(Sqlist *L,int i,ElemType *e)
{
int k;
if(L->length==0) /*线性表为空*/
return ERROR;
if(i<1 || i>L->length) /*删除位置不正确*/
return ERROR;
*e=L->data[i-1];
if(i<L->length) /*如果删除不是最后位置*/
{
for(k=1;k<L->length;k+=) /*将删除位置后继元素前移*/
L->data[k-1]=L->data[k];
}
L->length--;
return OK;
}
如果元素要插入到最后一个位置,或者删除最后一个元素,该时间复杂度为O(1),但是最坏的情况为元素要插入到第一个位置或者删除第一个元素,该时间复杂度为O(n)。
线性表顺序存储结构的优缺点:
优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速地存取表中任一 位置的元素
缺点:插入和删除操作需要运动大量元素;当线性表长度变化较大时,难以确定存储空间的容 量;造成存储空间的“碎片”
2、线性表的链式存储结构:
顺序存储结构不足的解决办法:采用链式存储结构
线性表链式存储结构定义:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,这就意味着这些数据元素可以存在未被占用的任意位置,链式结构中,不仅要存数据元素信息,还要存储它的后继元素的存储地址。数据域:存储数据元素信息的域;指针域:存储直接后继位置的域。指针域中存储的信息称为指针或链,这两部分信息组成数据元素的存储映像,称为结点(Node).链表中的第一个结点的存储位置叫头指针,线性表的最后一个结点指针为“空”,在单链表的第一个结点前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息。
头指针与头结点的异同:
头指针:1、头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指 针;头指针具有标识作用,所以常用头指针冠以链表的名字;无论链表是否为空,头指针均不 为空。头指针是链表的必要元素
头结点:头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般 无意义(也可存放链表的长度);有了头结点,对在第一元素结点前插入结点和删除第一结点, 其操作与其他结点的操作就统一了;头结点不一定是链表必须要素
线性表链式存储结构代码:
/*线性表的单链表存储结构*/
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList; /*定义LinkList*/