线性表
线性表是具有 相同数据类型的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);
}
编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻
如果本篇文章对你有帮助的话那就再好不过🌹
本篇文章存在多处不足,还望海涵

被折叠的 条评论
为什么被折叠?



