线性表
定义
逻辑关系:一对一
存储结构:可采用相邻的顺序存储结构,也可以采用不相邻的链式存储结构
实现
静态数组实现
define maxlen 100
define OK 1
typedef struct{
int elem[maxlen];
int length;
}SeqList;
在使用静态数组前,要进行初始化,将length置为1(略去)
指针数组实现(与链式存储不相同)
define LIST_INIT_SIZE 100//指针数组初始时申请的空间大小
define LISTINCREMENT 10//每次扩充空间的大小
define OK 1
typedef struct{
int *elem;
int length;
int listsize
}SqList;
在使用指针数组之前,需要先对其进行初始化。
int InitList(SqList &L){
L.elem = (int*)malloc(LIST_INIT_SZIE*sizeof(int));
if (L.elem == 0) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
链表实现
链表实现线性表,有带表头和不带表头两种方式。
带表头则为表头开辟一个存储空间,但不存入数据,操作简单。
不带表头则将头指针指向第一个元素的结点空间。但删除、插入操作变得复杂。
链表建立
链表的建立有首插法和尾插法两种。
//首插法
p->data=x;
p->next=head->next;
head->next = p;
//尾插法
p->data=x;
p->next=NULL;
r->next=p;
r=r->next;//r=p;
特殊的链表
循环单链表
双向链表:
双向循环链表:
操作
插入
- 判断空间是否空余,插入位置是否合理
- 静态数组则将其后元素后移,指针数组直接修改
- 修改表长
其余操作由于简单在此略过。
删除
带表头链表的删除操作需要设置两个结点,一个用于指示查找的数据元素,一个记录上一个结点的位置。
应用——一元多项式的表示和相加
数组存储
考虑到多项式中出现的多项为0的情况,定义结构体,存储多项式的系数和指数。
对数组存储的多项式进行求和运算,根据指数从小到大进行。
链式存储
设置3个结点。注意相加系数为0的情况。
作业
- 实现顺序表就地逆置——直接while循环a[i]=a[n-i-1]
- 设计高效算法在有序顺序表中插入一个新的数据元素二分法查找
4.1. 2个结点,第一个记录小于mink的最大结点,一个用来遍历链表直至找到大于mink的最小元素,p->next=q实现删除。
4.2 从头结点开始,逐个结点逆置
4.3 遍历链表
4.4 合并——逆序