线性表的动态分配顺序存储结构伪代码
(1)宏定义(替换):用一个字符串替换成另一个字符串,只可单独使用(定义)。
例:#define a 2(在程序中出现a的地方都替换成2)
(2)★★初始分配量/分配增量/线性表长度/当前分配的存储容量都是指的Elemtype变量的数量
在增加存储空间时计算数量×一个基类型的大小
如int类型 listsize=5→能存5个整数
(3)typedef(为一种数据类型定义一个新名字) 包括基类型/自定义类型(struct等)
type struct Stu{}a;(为结构体类型Stu定义一个新的名字a→其中a是结构体类型名)其中Stu可以省略
如下:定义了一个结构体(线性表)并换名为SqList(包括一个数组指针 长度及存储容量)
(4)elem是个数组指针(将指向一个elemtype的数组 其中elem是地址变量,赋值数组基地址)
#denine LIST_INIT_SIZE 100
(定义线性表存储空间的初试分配量为100)
#define LISTINCREMENT 10
(定义线性表存储空间的分配增量)
typedef struct
{
Elemtype *elem;
//存储空间基址 (数组指针,值为数组基地址)
int length; //(线性表的)当前长度
int listsize; //当前分配的存储容量,以sizeof(Elemtype)为单位
}SqList;
//定义了一个结构体(线性表)类型SqList
(1)Status(函数返回值类型)结果状态码:
①ERROR/FALSE→0 ②返回OK/TRUE→(转换成)1 ③OVERFLOW→2
(2)malloc(分配指定大小的内存)mem-allocate
用法:指令名=(Elemtype *)malloc(长度)
Elemtype指的是指针的类型
(3)括号 中是的是形参,SqList &L=L
→ L是SqList类型的实参(SqList) SL的引用
引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储单元
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType *)malloc
(LIST_INIT_SIZE*size(ElemType));
//L.elem地址变量 赋值 分配内存 的地址
if(!L.elem) exit(OVERFLOW);
//存储分配失败 (L.elem不存在则退出进程并返回OVERFLOW)
L.length=0;//设置空表长度
L.listsize=LIST_INIT_SIZE;/初始存储容量
return OK;
}
(1)realloc 是在原有的基础上在开辟若干空间
指针名=(类型 *)realloc(原指针名,新大小)
类型指的是指针的数据类型
如
Elemtype *newbase;
newbase=(ElemType *)realloc(原数组指针名,新大小);
②按照新大小重新分配空间,
③将原有数据从头到尾拷贝到新分配的内存区域
④并返回该内存区域的首地址。即重新分配存储器块。
(2)在第i(1≤i≤n)个元素之前插入一个元素e
(L.length=n)
★对于数组而言,从0→n-1
★对于元素而言,从1→n(可以在第一个之前到第n+1之前插入元素1≤i≤L.length+1)
(3)*(p+n), p[n]都是第(i+1)个元素的值
因为p是数组首地址,即p==&p[0];
L.elem[i-1]是第i个元素相当于*(L.elem+i-1)
L.elem+L.length-1 / &L.elem[L.length-1]
是最后一个(表尾)元素的地址
Status ListInsert_Sq(SqList &L,int i,ElemType e){
if(i<1 ll i>L.length+1) return ERROR;
//i值不合法
if(L.length≥L.listsize)
//当前存储空间已满,增加分配
{
ElemType *newbase;
newbase=(Elemtype *)
realoc(L.ele+(L.listsize+LISTINCREMNT)*sizeof(ElemType));
if ( ! newbase) exit( OVERFLOW) ;
//存储分配失败
L. elem = newbase;//新基址
L.listsizw+= LISTINCREMENT;
//增加存储容量
}
q=&(L.elem[i-1]);//q为插入位置
for(p=&(L.elem[L.length-1]);p≥q;--p);
*(p+1)=*p;
*q=e;//插入e
++L.length;
return OK;
}