第二章 线性表及其实现
2.1. 线性表的类型与定义
线性表是n个数据元素的有限序列,由若干个数据项组成数据元素,数据元素称为记录,含有大量记录的线性表叫做文件
2.2. 线性表顺序表示和实现
#define LIST_INIT_SIZE 100//初始空间分配量
#define LISTINCREMENT 10//增量
typedef struct{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前已分配量;
}Sqlist;
Status IntiList_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;}
//一般出于实际出发,会有初始数据//
//假设环境为int数据类型,该段代码没有考虑数据溢出的情况,只是方便初始化,也可用函数调用,使用插入新数据的函数来进行初始数据载入
int n;
printf("请输入要输入数据数量");
scanf_s("%d", &n);
printf("请输入数据");
for (int i = 0; i < n; i++)
{
scanf_s("%d", &L.elem[i]);
L.length++;//每次运行要注意加长度
}
//插入一个新元素到指定位置上方
Status ListInsert_Sq(SqList & L, int i, ElemType e)
{
ElemType *q,*p;
ElemType *newbase;
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)exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i - 1]);//q为插入的位置
for (p = &(L.elem[L.length - 1]); p >= q; --p)
{ *(p + 1) = *p;
}//从q位置后整体向后移
*q = e;//赋值q
++L.length;//表长加一
return Status(OK);
}
Status ListDelete_Sq(SqList & L, int i, ElemType & e)
{
if ((i < 1) || (i > L.length))return ERROR;//删除位置合法性判断
ElemType *q, *p;
p = &(L.elem[i - 1]);//指向删除位置
e = *p;//取出值
q = L.elem + L.length - 1;//指向表尾
for(++p;p<=q;++p)
{
*(p - 1) = *p;
};//从p开始后面的值赋值给前面的
--L.length;//减短表长
return Status(OK);
}//删除某一节点
关于插入元素的与删除元素的算法复杂度问题
2.3. 线性表的链式表示和实现
- 线性链表
- 循环链表
- 双向链表
2.4. 一元多项式的表示及相加