线性表
线性表是最常用而且最简单的一种书局结构,简言之,一个线性表是n个数据元素的有限序数。
线性结构的特点:
-
存在唯一一个被称作“第一个”的数据元素;
-
存在唯一一个被称作“最后一个”的数据元素;
-
除第一个之外,集合中的每个数据元素均只有一个前驱;
-
除最后一个之外,集合中的每个数据元素均只有一个后继;
线性表的顺序表示和实现
线性表的顺序表示
是用一组地址连续的存储单元依次存储线性表的数据元素。
比如线性表(1,2,3,4,5),共计5个元素,每个int型的数据元素假设占用4个存储单元,假设第1个元素数字1的存储地址是1000,则第2个元素数字2的存储地址是1004,第3个元 素数字3的存储地址是1008,依此类推,第n个数据元素的存储地址是 LOC(an) = LOC(a1)+(n-1)k.
k表示每个数据元素占用的存储单元的长度
显而易见,这种存储结构,相邻元素在物理位置上也相邻。通常,我们把采用这种存储结构的线性表称为“顺序表”。
线性表的顺序实现
由于高级程序设计语言中的数据数组类型也有随机存取的可读性,因此通常都用数组来描述数据结构中的顺序存储结构。在此,由于由于线性表的长度可变,而且所需的最大存储空间随文体不同而不同,则在c语言中可用动态分配的一维数组,如下描述啊;
--------------------------------------线性表的动态分配顺序存储结构--------------------------------------
#define InitSize 100 //线性表的存储空间的初始分配量
typedef struct SeqList
{
int *array; //存储空间基址
int capacity; //存储容量
int size; //当前长度
}
----------------------------------------------------------------------------------------------------------------------------
在上述的定义之中,数组指针array指示线性表的基地址,size,表示线性表的当前长度,线性表的初始化操作就是为线性表分配一个预定义大小的数组空间,并将当前的线性表的长度置为0.
--------------------------------------线性表的动态分配顺序初始化-------------------------------------
void SeqListDInit(SeqListD *pSLD)
{
assert(pSLD != NULL);
pSLD->capacity = CAPACITY;
pSLD->size = 0; //线性表的长度置为0.
pSLD->array = (DataType *)malloc(pSLD->capacity * sizeof(DataType)); //分配一个预定义大小的数组空间
assert(pSLD->array != NULL);
}
----------------------------------------------------------------------------------------------------------------------------
动态线性表代码如下:
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
typedef int DataType;
typedef struct SeqListDynamic {
DataType *array;
int capacity;
int size;
}SeqListD;
#define CAPACITY 2
// 动态顺序表的初始化
void SeqListDInit(SeqListD *pSLD)
{
assert(pSLD != NULL);
pSLD->capacity = CAPACITY;
pSLD->size = 0;
pSLD->array = (DataType *)malloc(pSLD->capacity * sizeof(DataType));
assert(pSLD->array != NULL);
}
// 销毁
void SeqListDDestory(SeqListD *pSLD)
{
assert(pSLD != NULL);
pSLD->size=0;
free(pSLD->array);
pSLD->capacity=0;
}
// 肯定不够
// 1. 容量变大
// 2. 开个新容量的空间
// 3. 把老数据迁移到新空间
// 4. 把老空间释放
// 5. 把新的空间挂过来
void ExpandSeqListD(SeqListD *pSLD)
{
if (pSLD->size < pSLD->capacity) {
return;
}
//1
pSLD->capacity=pSLD->capacity*2;
//2
DataType *newarray=(DataType*)malloc(sizeof(DataType)*pSLD->capacity);
assert(newarray != NULL);
//3
int i;
for(i=0;i<pSLD->size;i++)
{
newarray[i]=pSLD->array[i];
}
//4
free(pSLD->array);
//5
pSLD->array=newarray;
}
void SeqListDPushBack(SeqListD *pSLD, DataType data)
{
assert(pSLD !=NULL);
ExpandSeqListD(pSLD);
pSLD->array[pSLD->size++]=data;
}
// 头插
void SeqListDPushFront(SeqListD *pSLD, DataType data)
{
assert(pSLD != NULL);
ExpandSeqListD(pSLD);
// 剩下的和静态的一样
}
// 按下标插入
void SeqListDPushInsert(SeqListD *pSLD, int pos, DataType data)
{
assert(pSLD != NULL);
ExpandSeqListD(pSLD);
// 剩下的和静态的一样
}
void SeqListDPrint(SeqListD *pSLD)
{
int i;
for(i=0;i<pSLD->size;i++)
{
printf("%d->",pSLD->array[i]);
}
printf("\n");
}
void TestSeqListD()
{
SeqListD sl;
SeqListDInit(&sl);
SeqListDPushBack(&sl,1);
SeqListDPushBack(&sl,2);
SeqListDPushBack(&sl,4);
SeqListDPushBack(&sl,5);
SeqListDPushBack(&sl,8);
SeqListDPrint(&sl);
}
#include "list.h"
int main()
{
TestSeqListD();
return 0;
}