线性表的表示与实现
Chapter_two 线性表
线性表:数据特性相同的元素构成的有限序列
空表:线性表中元素个数为0
非空线性表或线性结构特点:
- 唯一的第一个数据元素
- 唯一的最后一个数据元素
- 除第一个,每个元素有一个前驱
- 除最后一个,每个元素有一个后继
对普通一元多项式求值,不改变系数和指数,可用数组,只储存多项式的系数;
但对于稀疏多项式,数组会导致空间浪费。而且在一般情况下,容易出现数组太小,不够存储。另外,需要开辟新的数组保存计算结果,导致较高的空间复杂度。
线性表的表示与实现
ps.其实学到这更深的是对ADT的体会…
顺序表:采用顺序存储结构的线性表
链表:采用链式存储结构的线性表
顺序表
此处ADT有两种定义方式:
由于书上是第一种,就用第一种吧…
具体功能的算法就不呈现了,要记一下各个算法的时间复杂度。
这里放出顺序表的C++实例,只有简单的定义、初始化、赋值和输出。
#include<iostream>
using namespace std;
typedef struct {
int *data; //当前地址
int length; //总长
}SqList;
#define OK 1;
#define ERROR 0;
#define OVERFLOW -2;
int InitList(SqList &L);
void Create(SqList &L, int n);
void PrintList(SqList &L, int n);
int main() {
int n;
SqList list;
cin >> n;
InitList(list);
Create(list, n);
PrintList(list, n);
return 0;
}
//初始化
int InitList(SqList &L) {
L.data = new int[100]; //分配空间
if (L.data == 0) {
exit(OVERFLOW); //分配失败退出
}
L.length = 0; //长度为0
return OK;
}
//创建顺序表并输入数据
void Create(SqList &L, int n) {
for (int i = 0; i < n; i++) {
cin >> L.data[i];
}
return;
}
//输出
void PrintList(SqList &L, int n)
{
for (int i = 0; i < n; i++) {
cout << L.data[i];
if (i + 1 != n) {
cout << ' ';
}
}
}
单链表
其次我们要理解以下三个概念:
- 首元结点:存储第一个有用数据的结点。非空链表必有一个首元结点
- 头结点:首元结点前的结点,为了保持操作的一致性而设,通常为空或存放线性表长度等。并非所有链表都有头节点。
- 头指针:指向链表中第一个结点的指针,即指向头结点或首元结点。
同样,以下是单链表的C++实例,只有简单的定义、初始化、后插和输出
#include<iostream>
using namespace std;
typedef struct Node {
int data;
Node *next;
}Node, *LinkList;
#define OK 1;
#define ERROR 0;
int InitList(LinkList &L);
void Create(LinkList &L, int n);
void PrintList(LinkList L);
int main() {
int n;
LinkList head;
cin >> n;
Create(head, n);
PrintList(head);
return 0;
}
//初始化链表
int InitList(LinkList &L) {
L = new Node;
L->next = NULL;
return OK;
}
//为链表L输入n个数据
void Create(LinkList &L, int n) {
LinkList r;
InitList(L); //初始化链表
r = L; //r为尾指针
for (int i = 0; i < n; ++i) {
Node *p = new Node; //p为新建的最后一个结点
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
//输出链表
void PrintList(LinkList L) {
LinkList p = L->next;
/*if (p == NULL) {
cout << "Empty List";
}*/
while (p) {
cout << p->data;
if (p->next != NULL) {
cout << ' ';
}
p = p->next;
}
}