链表
一、链表
1.链表即为线性表的链式存储结构,逻辑上相邻的元素在物理上不相邻。
2.通过指针来实现元素之间的逻辑关系,一个链表由数据域和指针域构成。
3.相对于顺序表,链表不能实现随机存储,查找元素需要从头开始遍历;但是链表在对元素进行插入和删除操作时,不需要移动元素,并且不需要分配连续的储存空间。
二、链表的实现
链表是一种递归的数据结构,要么为空,要么指向下一个结点。定义一个结点的结构体,结构体包含一个数据值和一个指向下一个结点的指针:
struct LNode
{ int val;
LNode *next;
};
实现简单的增删查改(C++):
#include<iostream>
using namespace std;
//链表结点结构体定义
struct LNode {
int val;
LNode *next;
//默认构造函数
LNode():val(0),next(nullptr){}
//接受一个参数的构造函数
LNode(int x) :val(x), next(nullptr) {}
};
//创建链表,生成头结点
void create(LNode *l)
{
l->val = 0;
l->next = nullptr;
}
//在表头插入元素
void insert(LNode *l,int e)
{
LNode *q = new LNode(e);
q->next = l->next;
l->next = q;
}
//删除表头元素
void erase(LNode *l, int &e)
{
if (l->next)
{
e = l->next->val;
l->next = l->next->next;
}
else
cout << "表为空!" << endl;
}
//遍历打印链表元素
void traverse(LNode *l)
{
LNode *q = l;
while (q->next)
{
cout << q->next->val << " ";
q = q->next;
}
cout << endl;
}
//链表长度
int length(LNode *l)
{
LNode *q = l;
int i = 0;
while (q->next)
{
++i;
q = q->next;
}
return i;
}
//查找第i个元素的值
int find_ith(LNode *l, int i)
{
int j = 0;
LNode *q = l;
while (q->next&&j != i - 1)
{
q = q->next;
++j;
}
if (!q->next)
return -1;
return q->next->val;
}
//替换第i个元素的值
void change_ith(LNode *l, int i,int e)
{
int j = 0;
LNode *q = l;
while (q->next&&j != i - 1)
{
q = q->next;
++j;
}
if (!q->next||j>=i)
cout << "元素不存在!" << endl;
q->next->val = e;
}
//功能展示:
int main()
{
LNode *l = new LNode(); //创建头结点
create(l);
int e = 0;
insert(l, 2);
insert(l, 3);
insert(l, 4);
insert(l, 5);
cout << "链表元素为: " << endl;
traverse(l);
erase(l, e);9
cout << "删除元素为: "<<e << endl;
cout << "链表元素为: " << endl;
traverse(l);
cout << "链表长度为: " << endl;
cout << length(l) << endl;
cout << "第2个元素为: "<<find_ith(l, 2) << endl;
change_ith(l, 2, 5); //替换第二个元素值
cout << "链表元素为: " << endl;
traverse(l);
return 0;
}
程序运行结果: