数据结构 -- #什么是线性表?顺序表,链表如何实现(C++)

线性表


线性表是具有 相同数据类型的n个数据元素的 有限序列
除了第一个元素以外,每一个元素都有一个直接前驱
除了最后一个元素以外,每一个元素都有一个直接后继

顺序表 : 使用顺序存储的方式实现线性表。
顺序存储 : 逻辑上相邻的数据元素物理位置上也相邻

链表 : 使用链式存储的方式实现线性表
链式存储 : 逻辑上相邻的数据元素物理位置不一定相邻

顺序表和链表的异同

逻辑结构 : 其都属于线性表,是线性结构

存储结构:

  • 顺序表因其顺序存储的特点,其具有 随机存取 的特性(O(1)时间复杂度内查找元素),其结点元素只存储数据, 存储密度高,但是其由于要求分配连续的存储空间,改变容量不方便。
  • 链表因其链式存储的特点,其不要求分配连续的存储空间,因而改变容量方便,但是其也失去了随机存取的特点,并且由于其结点加入了指向下一个元素的信息,存储密度低

基本操作 :

创造 :
  • 顺序表:需要预分配固定的空间,
  • 链表:只需声明一个头指针指向头结点即可
插入 删除:
  • 顺序表 : 需要移动大量元素 O(n) 来自于移动元素
  • 链表 : 只需要修改指针即可 O(n) 来自于查找目标元素
查找 :
  • 顺序表 : 按位查找 : O(1) 按值查找 : O(n)
  • 链表 : O(n)

因此,大量增删操作使用链表,查找操作使用顺序表

代码实现

带头结点的单链表

#include <iostream>

using namespace std;

typedef struct lNode {
	int data;
	struct lNode* next;
}lNode,*linkList;

bool empty(linkList l) {
	return l->next == NULL;
}

bool initList(linkList& l) {
	l = (lNode*)malloc(sizeof(lNode));
	if (l == NULL)return false;

	l->next = NULL;
	return  true;
}

bool listInsert(linkList& l, int i, int e) {
	if (i < 1)return false;

	lNode* p = l;//指针p指向当前扫描到的结点
	int j = 0;//当前p指向的是第几个结点

	while (p->next != NULL && j < i - 1) {
		p = p->next;
		j++;
	}

	if (p == NULL)return false;

	lNode* s = (lNode*)malloc(sizeof(lNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

bool insertNextNode(lNode* p, int e) {
	if (p == NULL)return false;
	lNode* s = (lNode*)malloc(sizeof(lNode));
	if (s == NULL)return false;

	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

bool insertPre(lNode* p, int e) {
	if (p == NULL)return false;
	lNode* s = (lNode*)malloc(sizeof(lNode));
	
	if (s == NULL)return false;

	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;
	return true;
}

bool listDel(linkList& l, int i, int e) {
	if (i < 1) return false;

	lNode* p = l;
	int j = 0;

	while (p != NULL && j < i - 1) {
		p = p->next;
		j++;
	}
	//因为删除要让p的前驱结点指向p的后继结点
	if (p == NULL || p->next==NULL)return false;

	lNode* q = p->next;
	e = q->data;
	p->next = q->next;
	free(q);
	return true;
}

bool deleteNode(lNode* p) {
	if (p == NULL)return false;
	lNode* q = p->next;

	p->data = p->next->data;
}

//按位查找
lNode* getElem(linkList l, int i) {
	if (i < 0)return NULL;
	
	lNode* p = l;
	int j = 0;
	//不找前驱,找前驱是j<i-1
	while (p != NULL && j < i) {
		p = p->next;
		j++;
	}

	return p;
}

//按值查找
lNode* locateElem(linkList l, int e) {
	lNode* p = l->next;

	while (p != NULL && p->data != e)p = p->next;

	return p;//找不到则是返回NULL
}

int main(){

}

静态数组实现的顺序表

#include <iostream>

using namespace std;

#define maxSize 10

typedef struct {
	int data[maxSize];
	int length;
}sqList;

void initList(sqList& l) {
	for (int i = 0; i < maxSize; i++) {
		l.data[i] = 0;//防止脏数据
	}
	l.length = 0;//顺序表初始长度为0
}

//在l的i位置插入元素e
bool listInsert(sqList& l, int i, int e) {
	if (i<1 || i>l.length + 1)return false;
	if (l.length >= maxSize)return false;

	for (int j = l.length; j >= i; j--) {
		l.data[j] = l.data[j - 1];
	}

	l.data[i - 1] = e;
	l.length++;

	return true;
}
//删除i位置上的元素
bool listDelete(sqList& l, int i, int& e) {
	if (i<1 || i>l.length)return false;
	
	e = l.data[i - 1];
	for (int j = i; j < l.length; j++) {
		l.data[j - 1] = l.data[j];
	}
	l.length--;
	return true;
}
//查找值为e的元素
int locateElem(sqList l, int e) {
	for (int i = 0; i < l.length; i++) {
		if (l.data[i] == e)return i + 1;
	}
	return 0;
}
//查找位序为i的元素
int getElem(sqList l, int i) {
	return l.data[i - 1];
}

int main() {
	sqList l;
	initList(l);
}

使用数组实现的单链表


编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻
如果本篇文章对你有帮助的话那就再好不过🌹
本篇文章存在多处不足,还望海涵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值