线性表

定义

逻辑关系:一对一
存储结构:可采用相邻的顺序存储结构,也可以采用不相邻的链式存储结构

实现

静态数组实现

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;

特殊的链表
循环单链表
数据结构与算法复习笔记——线性表_数组
双向链表:
数据结构与算法复习笔记——线性表_结点_02
双向循环链表:
数据结构与算法复习笔记——线性表_结点_03

操作

插入

  1. 判断空间是否空余,插入位置是否合理
  2. 静态数组则将其后元素后移,指针数组直接修改
  3. 修改表长

其余操作由于简单在此略过。

删除

带表头链表的删除操作需要设置两个结点,一个用于指示查找的数据元素,一个记录上一个结点的位置。

应用——一元多项式的表示和相加

数组存储

考虑到多项式中出现的多项为0的情况,定义结构体,存储多项式的系数和指数。
对数组存储的多项式进行求和运算,根据指数从小到大进行。

链式存储

设置3个结点。注意相加系数为0的情况。
数据结构与算法复习笔记——线性表_链表_04

作业

  1. 实现顺序表就地逆置——直接while循环a[i]=a[n-i-1]
  2. 设计高效算法在有序顺序表中插入一个新的数据元素二分法查找

数据结构与算法复习笔记——线性表_指针数组_05
4.1. 2个结点,第一个记录小于mink的最大结点,一个用来遍历链表直至找到大于mink的最小元素,p->next=q实现删除。
4.2 从头结点开始,逐个结点逆置
4.3 遍历链表
4.4 合并——逆序