线性表
通常用一组连续地址的内存单元来存储整张表中的数据信息
实现方式
1、静态分配空间——数组
2、动态分配空间——动态数组(malloc、realloc)
特征
1、有唯一一个表名标识该表
2、占据一块连续的内存单元
3、数据顺序存放,元素之间存在先后关系
线性表-顺序存储。
优点
1)逻辑相邻,物理相邻。
2)可随机存取任一元素 例:A[9]。
3)存储空间使用紧凑。
缺点
1)插入、删除操作需要移动大量的元素。
2)预先分配空间需按最大空间分配,利用不充分。
3)表容量难以扩充。
线性表-顺序存储(动态分配空间)
1)定义采用malloc()
2)追加采用realloc()
#include <cstdio>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//线性表(动态数组)(动态分配空间)
#define MAXSIZE 3
typedef struct {
int* elem;
int length;
int listSize;
}Nodelist;
/*初始化一个动态链表申请MAXSIZE 个int 类型 数据的内存空间*/
void initSqlist(Nodelist* L)
{
L->elem = (int*)malloc(MAXSIZE * sizeof(int));
if (L->elem == NULL)// 如果malloc申请内存失败
exit(-1);
L->length = 0;// 已使用的个数 为0
L->listSize = MAXSIZE;// 申请总个数为MAXSIZE 个单位数据结构
}
// 在表L中的第i个位置,插入 item
void insertElem(Nodelist* L, int i, int item)
{
int* base, * insertptr, * p;
if (i<0 || i > L->length)
{
printf("插入位置不对\n");
exit(0);
}
//所申请的内存空间全部用完,需要动态追加新的内存空间
if (L->length == L->listSize)
{
//增加一个空间
base = (int*)realloc(L->elem, (L->listSize + 1) * sizeof(int));
L->elem = base;//连续的空间
L->listSize++;
}
// 得到插入地点的地址
insertptr = &(L->elem[i]);
// 当插入的位置在前length个 的某个位置的时候。
if (i < L->length)
{
// 从最后一个元素,依次往后挪
for (p = &(L->elem[L->length - 1]); p >= insertptr; p--)
{
*(p + 1) = *p;
}
}
// 插入要插入的数
*insertptr = item;
// 使用的位置数目加一
L->length++;
}
int main()
{
Nodelist L;
int i = 0;
initSqlist(&L);
for (int i = 0; i < 5; i++)
{
insertElem(&L, i, i);
}
for (i = 0; i < 5; i++)
{
printf("L->elem[%d]=%d\n", i, L.elem[i]);
}
return 0;
}