说明:由于vc6对模板类的支持不友好,所以使用了 测试使用了 int 类型。
优点:
1.克服了顺序表的缺点,动态存储分配来存储线性表。链接存储结构
【c++|单链表的增删改查操作(代码完整)】2.插入和删除元素,只需要修改指针,不需要移动元素。
缺点:
1.指针的结构性开销
2.存取表中的任一元素不方便,只能顺序存取。(必须从头指针开始访问)
头文件:函数的声明
#include
#include
using namespace std;
struct Node
{
int data;
Node *next;
};
class CLinkList
{
public:
CLinkList();
//无参数的构造函数
virtual ~CLinkList();
CLinkList(int a[], int n);
//有参析构函数,建立只有头结点的空链表
int Length();
//求单链表的长度
int Get(int i);
//按位查找,在单链表中查找第I个结点的元素值
int Locate(int x);
//按值查找,在单链表中查找值x的元素序号
int Insert(int i, int x);
//插入操作,在第I个位置插入元素值为x的结点
int Delete(int i);
//删除查找,在单链表中删除第I个结点
void Modify(int i, int x);
//修改操作,修改第I个
void PrintList();
//遍历操作,按序号依次输出元素
private:
Node *first;
//单链表的头指针
};
.cpp文件
#include "LinkList.h"
#include
#include
//使用setw 需要include iomanip
//使用NULL需要include windows
CLinkList::CLinkList()
{
first = new Node;
//生成头节点
first->next = NULL;
//头节点的指针域置空
}CLinkList::~CLinkList()
{
while(first != NULL)//释放单链表的每一个结点的存储空间
{
Node *q = first;
//暂存被删除结点
first = first->next;
//first指向被释放的节点的下一个节点
delete q;
}
}//头插法:新节点插在头节点的后面
CLinkList::CLinkList(int a[], int n)
{
first = new Node;
//生成头节点
first->next = NULL;
//头节点的指针域置空 for (int i = 0;
i < n;
i++) {
Node *s = new Node;
//为数组每个元素建立一个节点
s->data = https://www.it610.com/article/a[i];
s->next = first->next;
//将结点s插入到头节点之后
first->next = s;
}
}//尾插法:新节点插在头节点的后面
//CLinkList::CLinkList(int a[], int n)
//{
// Node int first = new Node;
//生成头节点
// Node r = first;
//尾指针初始化// for (int i = 0;
i < n;
i++) {
//Node s = new Node;
//为数组每个元素建立一个节点
//s->data = https://www.it610.com/article/a[i];
//r->next = s;
//将结点s插入到尾节点之后
//r = s;
// }
// r->next = NULL;
//单链表建立完毕,将终端节点的指针域置空
//}//打印链表的值
//时间复杂度O(n)
void CLinkList::PrintList()
{
Node *p;
p = first->next;
//工作指针初始化
if (!p)
cout<<"单链表为空";
while(p!= NULL)
{
coutnext;
//工作指针后移,不能p++
}
}//链表长度
int CLinkList::Length()
{
Node *p;
p = first->next;
//工作指针初始化
int count = 0;
while(p!= NULL)
{
coutnext;
//工作指针后移,不能p++
count++;
}
return count;
}//按序号查找
//平均时间性能为O(N),为顺序存取结构
int CLinkList::Get(int i)
{
Node *p;
p = first->next;
//工作指针初始化
int count = 1;
while(p!= NULL && count < i)
{
p = p->next;
//工作指针后移,不能p++
count++;
}
if (p == NULL) throw "位置错误";
else return p->data;
}//按值查找
int CLinkList::Locate(int x)
{
Node *p;
p = first->next;
//工作指针初始化
int count = 1;
while(p!= NULL)
{
if (p->data =https://www.it610.com/article/= x) return count;
//查找成功,结束并返回序号
p = p->next;
//工作指针后移,不能p++
count++;
}
return 0;
//退出循环表明查找失败
}//插入操作
//找到要插入位置的前一个位置
//把前一个位置的next 给 新结点的next
//把前一个位置的next 指向新结点
int CLinkList::Insert(int i, int x)
{
Node *p;
p = first->next;
//工作指针初始化
int count = 0;
while(p!= NULL && count < i - 1) //查找第i个结点
{
p = p->next;
//工作指针后移,不能p++
count++;
}
if (p == NULL) throw "位置错误";
else {
Node *s = new Node;
s->data = https://www.it610.com/article/x;
//申请一个新结点
s->next = p->next;
p->next = s;
//将结点s插入到节点p之后
}
return 0;
//退出循环表明查找失败
}//删除操作
int CLinkList::Delete(int i)
{
Node *p;
p = first->next;
//工作指针初始化
int count = 0;
while(p!= NULL && count < i - 1) //查找第i个结点
{
p = p->next;
//工作指针后移,不能p++
count++;
}
if (p == NULL || p->next == NULL) throw "位置错误";
//节点P不存在或后继节点不存在
else {
Node *q = p->next;
//暂存
int x = q->data;
p->next = q->next;
//摘链
delete q;
return x;
}
}
测试
#include
#include
using namespace std;
#include "LinkList.h"
int main() {
int a[7] = {1, 2, 3, 4, 5, 6, 7};
cout<<"单链表的初始化"<
文章图片
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题