-
线性表数据结构的特点:
- 在数据元素的非空有限集中,线性表中:(1)存在唯一一个被称作“第一个结点的元素”(2)存在唯一一个被称作“最后一个结点的元素”(3)除了第一个元素外,每个元素都有一个直接前驱(4)除了最后一个元素外,每个元素都有一个直接后继。
线性表可以分为顺序表和链表
- 顺序表(Sequential List)
静态定义
动态定义
The pics is screenshot from XDF
/*Static Initialization the List*/
void InitList(Sqlist & L)
{
L.length = 0;
}
/*Dynamic Initialization the List*/
Status InitList(Sqlist * L)
{
L->elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L->elem)
exit(OVERFLOW);
L->length = 0;
L->listsize = LIST_INIT_SIZE;
}
/*Note that in the following description,the length of the list may represent by variable "last"*/
int InsertList(Sqlist * L, int i, ElemType e)
{
//插入算法
//i的取值范围:0 < i <= L->last + 1;
int j;
//考虑第一种插入位置非法
if (i < 1 || i > L->last + 1)
return ERROR; //#define ERROR -1
//考虑第二种表满的情况
if (L->last >= L->listsize)
{
L->elem=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)sizeof(ElemType));
if (!L->elem)
exit(OVERFLOW);
L->listsize += LISTINCREMENT;
}
for (j = L->last; j >= i; --j)
L->elem[j] = L->elem[j-1];
L->elem[i - 1] = e;
L->last += 1;
return 0;
}
void DeleteList(Sqlist * L, int i)
{
if (i < 1 || i > L->last){
fprintf(stderr, "Wrong position!\n");
exit(-1);
}
for (int j = i; j < L->last; j++)
L->elem[j - 1] = L->elem[j];
L->last -= 1;
}
int Locate(Sqlist L, int e)
{
for (int i = 0; i < L->last; ++i)
{
if (L->elem[i] == e)
return i + 1;
}
return NOT_FOUND;//#define NOT_FOUND -1 before
}
int Merge(Sqlist * LA,Sqlist * LB,Sqlist * LC)
{
//Define two assist-pointer i,j
int i = 0;
int j = 0;
//represent the length of the Sqlist LC
int k = 0;
while (i < LA->last && j < LB->last)
{
if (LA->elem[i] < LB->elem[j]){
InsertList(LC,k+1, LA->elem[i]);
//LC->elem[k] = LA->elem[i];
i ++;
k ++;
}
else
{
InsertList(LC,k+1, LB->elem[j]);
//LC->elem[k] = LB->elem[j];
j ++;
k ++;
}
}
while (i < LA->last)
{
InsertList(LC,k+1, LA->elem[i]);
LC->elem[k] = LA->elem[i];
i ++;
k ++;
}
while (j < LB->elem[j])
{
InsertList(LC,k+1, LB->elem[j]);
//LC->elem[k] = LB->elem[j];
j ++;
k ++;
}
LC->last = LA->last + LB->last;
}
int get_length(Sqlist * L)
{
return L->last;
}
- 链表
定义
typedef struct LNODE{
ElemType data;
struct LNODE * next;
}LNODE,* LinkList;
创建过程
LinkList InitList()
{
int n;
LinkList L;
LinkList ptr;
LinkList trail;
ElemType data;
L = (struct LNODE *)malloc(sizeof(LNODE));
trail = L;
trail->next = NULL;
scanf("%d",&n);
for (int i = 0; i < n; ++i)
{
ptr = (struct LNODE *)malloc(sizeof(LNODE));
scanf("%d",&data);
ptr->data = data;
trail->next = ptr;
trail = ptr;
}
ptr->next = NULL;
return L;
}
LinkList InitList()
{
int n;
ElemType data;
LinkList L;
LinkList ptr;
L = (struct LNODE *)malloc(sizeof(LNODE));
scanf("%d",&n);
L->next = NULL;
for (int i = 0; i < n; ++i){
ptr = (struct LNODE *)malloc(sizeof(LNODE));
scanf("%d",&data);
ptr->data = data;
ptr->next = L->next;
L->next = ptr;
}
}
/*==========No head node==============*/
LinkList InitList()
{
int n;
ElemType data;
LinkList L = NULL;
LinkList ptr;
scanf("%d",&n);
for (int i = 0; i < n; ++i){
ptr = (struct LNODE *)malloc(sizeof(LNODE));
scanf("%d",&data);
ptr->data = data;
ptr->next = L;
L = ptr;
}
return L;
}
LinkList InitList()
{
int n;
ElemType data;
LinkList L = NULL;
LinkList trail = NULL;
LinkList ptr;
scanf("%d",&n);
for (int i = 0; i < n; ++i){
ptr = (struct LNODE *)malloc(sizeof(LNODE));
scanf("%d",&data);
ptr->data = data;
if (L == NULL)
L = ptr;
else
trail->next = ptr;
trail = ptr;
}
if (trail != NULL)
trail->next = NULL;
return L;
}
顺序表与链表的异同比较
顺序表插入数据平均移动元素的个数:
顺序表删除数据平均移动元素的个数:
顺序表查找数据的ASL:
ASLss = (n+1) / 2
顺序表的存储密度为1,链表的存储密度<1(结点中有指针域)