一、顺序线性表
1、掌握顺序表中元素的前驱、后续的概念。
2、掌握顺序表的建立、插入元素、删除表中某元素的操作。
3、对顺序表相应算法的时间复杂度进行分析
4、理解链表数据结构的特点(优缺点)。
线性表:零个或多个数据元素的有限序列。
1、掌握顺序表中元素的前驱、后续的概念。
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
顺序表的前驱与后继指的是当前元素前一个元素与后一个元素分别是什么。如图所示,a[i-1]与a[i+1]分别是a[i]的前驱与后继。
2、掌握顺序表的建立、插入元素、删除表中某元素的操作。
//测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
#define LISTINCREMENT 10 // 线性表存储空间的分配增量
typedef char ElemType;
typedef int Status;
// SqList结构定义如下:
typedef char ElemType;
typedef int Status;
typedef struct
{
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
// 初始化:创建一个空的线性表L;
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length = 0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
// 插入:线性表L中第i个位置之前插入新的元素e
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
ElemType *newbase,*p,*q;
if(i<1||i>L.length+1)return ERROR;
if(L.length>=L.listsize)
{
newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
return OVERFLOW;
L.listsize +=LISTINCREMENT;
}
q = &(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
// 删除:在顺序表L中删除第i个元素,并用e返回其值
Status ListDelete_Sq(SqList &L,int i, ElemType &e)
{
ElemType *p,*q;
if((i<1)||(i>L.length))return ERROR;
p = &(L.elem[i-1]);
e = *p;
q = L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
}
// 销毁顺序表操作:销毁成功,返回OK。
Status DestroyList(SqList &L){
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
}
// 判断顺序表是否是空表:如果顺序表为空,返回1,否则,返回0。
Status ListEmpty(SqList L){
if(L.length=0)
return OK;
else
return ERROR;
}
int main()
{
char A[5] = {'a','b','c','d','e'},temp='f';
//temp用来存放插入的字符以及保存删除字符的值
int i;
SqList List;
InitList_Sq(List);
for(i=1; i<=5; i++)
ListInsert_Sq(List,i,A[i-1]);
if(!ListEmpty(List))
cout<<"顺序表非空\n";
cout<<"开始时元素序列为:\n";
for(i=1; i<= List.length; i++)
cout<< List.elem[i-1];
i=4; //插入位置
ListInsert_Sq(List,i,temp);
cout<<"\n插入后的元素序列为:\n";
for(i=1; i<= List.length; i++)
cout<<List.elem[i-1];
i=3;
ListDelete_Sq(List,i,temp) ;
cout<<"\n删除后的元素序列为:\n";
for(i=1; i<= List.length; i++)
cout<< List.elem[i-1];
if(DestroyList(List))
cout<<"\n成功释放顺序表L"; }
3、对顺序表相应算法的时间复杂度进行分析*
****线性表的顺序存储结构中,存、读数据时,不管是在哪个位置,时间复杂度都是O(1);
插入或删除时,时间复杂度都是O(n)。
4、理解链表数据结构的特点(优缺点)。
优点:
(1)无须为表示表中元素之间的逻辑关系而增加额外的空间;
(2)可以快速地读取表中任一位置的元素。缺点:
(1)插入和删除操作需要移动大量的元素;
(2)当线性表长度变化较大时,难以确定存储空间的容量 ;
(3)造成存储空间的“碎片”