数据结构学习手册——(线性表一)#持续更新
线性表的顺序存储结构
实现GetElem的具体操作
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
typedef int Status;
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;
}//用e返回L中第i个元素的值
实现插入操作ListInsert(*L , i, e)
//如果插入位置不合理,抛出异常
//如果线性表长度大于等于数组长度,则抛出异常或动态增加数组容量
//从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移动一个位置
//将要插入的元素填入位置i处
//线性表长度+1
Status ListInsert(SqList *L, ElemType e)
{
int k;
if( L->length == MAXSIZE )
{
return ERROR;
}
if( L->length == MAXSIZE )
{
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;
}
线性表删除ListDelete
//删除L的第i个数据元素,并用e返回其值;L的长度-1;
Status ListDelste(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 = i; k < length; k++ )
{
L->data[k-1] = l->data[k];
}
}
L->length--;
return OK;
}
线性表顺序存储结构的优缺点
优点: ——无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
——可以快速地存取表中任意位置的元素。
缺点: ——插入和删除需要移动大量的元素。
——当线性表长度变化较大时,难以确定存储空间的容量。
——容易造成存储空间的 “ 碎片 ” 。(eg:Windows 磁盘碎片整理)
线性表的链式存储结构
特点:用一组任意的存储大院存储线性表的数据元素
不仅要存数据元素,还要存后继元素的存储地址(指针
单链表
——头指针不为空,常用头指针冠以链表的名字(指针变量的名字)
——头指针是链表的必要元素
(头指针在头结点之前,头结点不是必要的,头结点的数据域不存储任何信息)
用结构指针来描述单链表
概念:——存储数据元素信息的域称为数据域
——存储直接后继位置的域称为指针域,指针域中存储的信息称为指针或链
这两部分信息组成的数据元素称为存储映像,称为结点(Node)
typedef struct Node
{
ElemType data; //数据域
struct Node* Next;//指针域
}Node;
typedef struct Node* LinkList;