线性表的表示与实现

本文介绍了线性表的概念,包括空表和非空线性表的特点。线性表可以使用顺序表或链表来实现。顺序表采用数组存储,适合存储元素数量固定的场景。链表则采用链式存储,便于插入和删除操作。文中提到了顺序表和单链表的ADT定义,并给出了C++实现的基本操作。
摘要由CSDN通过智能技术生成

Chapter_two 线性表

线性表:数据特性相同的元素构成的有限序列
空表:线性表中元素个数为0
非空线性表或线性结构特点:

  1. 唯一的第一个数据元素
  2. 唯一的最后一个数据元素
  3. 除第一个,每个元素有一个前驱
  4. 除最后一个,每个元素有一个后继
    对普通一元多项式求值,不改变系数和指数,可用数组,只储存多项式的系数;
    但对于稀疏多项式,数组会导致空间浪费。而且在一般情况下,容易出现数组太小,不够存储。另外,需要开辟新的数组保存计算结果,导致较高的空间复杂度。

线性表的表示与实现

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 << ' ';
		}
	}
}
单链表

在这里插入图片描述
其次我们要理解以下三个概念:

  1. 首元结点:存储第一个有用数据的结点。非空链表必有一个首元结点
  2. 头结点:首元结点前的结点,为了保持操作的一致性而设,通常为空或存放线性表长度等。并非所有链表都有头节点。
  3. 头指针:指向链表中第一个结点的指针,即指向头结点或首元结点。

同样,以下是单链表的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;
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值