前言
顺序表用一段地址连续的存储单元存储数据元素,最大的缺点就是插入和删除时需要移动大量元素,耗费时间。链式存储线性表时,存储单元可以是连续的也可以是不连续的,通过“链”建立起数据元素之间的逻辑关系,因此插入和删除元素操作不需要移动元素,而只需要修改指针,但也会失去顺序表可随机存取的优点。我们将存储数据元素的域称为数据域,把存储后继位置的域称为指针域,这两部分信息组成结点。而此链表每个结点只含有一个指针域,所以叫做单链表。
一、单链表概念图
单链表每个结点只含有一个指针域。注意:头指针是链表的必要元素,头结点不一定是链表的必要元素。
二、C++单链表实现(完整代码)
代码如下(部分操作未做相关判断可自行添加,小白实现可能会有部分不足请见谅):
#include<iostream>
using namespace std;
typedef struct Node {
int val;
struct Node *next;
}ListNode, List;
//初始化链表
void InistList(List* &L)
{
cout << "初始化链表" << endl;
L->val = 0;
L->next = NULL;
}
//头插法
void InsertListFront(List* &L, int elem)
{
cout << "头插法" << endl;
if (!L) {
cout << "链表为空" << endl;
return;
}
ListNode* q = NULL;
q = new ListNode; //为结点开辟空间
q->val = elem;
q->next = L->next;
L->next = q;
}
//尾插法
void InsertListBack(List* &L, int elem)
{
cout << "尾插法" << endl;
if (!L) {
cout << "链表为空" << endl;
return;
}
ListNode* q = NULL;
q = new ListNode;
q->val = elem;
ListNode* last = NULL;
last = L;
while (last->next) //将结点指到链表最后
{
last = last->next;
}
q->next = last->next;
last->next = q;
}
//按位插入
void InsertListPose(List* &L, int pos, int elem) //pos为下标
{
cout << "在" << pos << "位插入" << endl;
List* L1 = NULL;
L1 = L;
int index = 0;
while (index < pos && L1->next) //遍历链表到pos前面一位
{
L1 = L1->next;
index++;
}
ListNode* q = NULL;
q = new ListNode;
q->val = elem;
q->next = L1->next;
L1->next = q;
}
//删除位置结点
void DeleteLostPose(List* &L, int pos)
{
cout << "删除" << pos << "位置结点" << endl;
List* L1 = NULL;
L1 = L;
int index = 0;
while (index < pos && L1->next) //遍历链表到pos前面一位
{
L1 = L1->next;
index++;
}
ListNode* q = NULL;
q = new ListNode;
q = L1->next; //临时保存被删结点的地址以备释放空间
L1->next = q->next;
delete q; //释放被删除结点的空间
}
//遍历链表
void PrintList(List* &L)
{
cout << "遍历链表" << endl;
if (!L){
cout << "链表为空" << endl;
return;
}
List* q = NULL;
q = L->next;
while (q)
{
cout << q->val << " ";
q = q->next;
}
cout << endl;
}
//销毁链表
void DeleteList(List* &L)
{
cout << "销毁链表" << endl;
ListNode* q = NULL;
q = L;
while (q)
{
L = L->next;
delete q; //释放被删除结点的空间
q = L;
}
}
int main()
{
List *L = new List;
InistList(L);
for (int i = 0; i < 3; i++)
{
InsertListBack(L, i);
}
InsertListPose(L, 2, 22);
PrintList(L);
DeleteLostPose(L, 1);
PrintList(L);
DeleteList(L);
PrintList(L);
return 0;
}
总结
以上为单链表的创建等一系列操作,本人小白,如有错误,欢迎大佬们指点出来。