今天英语只复习了单词,由于数据结构需要,下午系统复习了链表方面内容,以下是我整理的一个链表模版。
include
include
using namespace std;
/*
指针可以解决数组增删改麻烦的问题,还有数据的样本量不确定的问题
链表从第一个数据开始,依靠指针遍历;
链表访问某一单个数据,效率不如数组;
数组优势在于元素个数已知情况下;
链表优势在于储存要求不断改变的元素;
链表写成类更方便;
cpp允许人管理内存,这样运算快;
/
class Node {//节点类
public:
string id;//学号
string name;//名字
int age;//年龄
Node next;//指向下一节点的指针
Node()
{
next = nullptr;
}
void display()
{
cout << id << " " << name << " " << age << endl;
}
};
class Link {
public:
Node* head;
Link() {
//Node n;
//Node* head = &n;//这样生成的n是在栈空间,生命周期结束自动回收,这样写导致head最后指向一个无用的n;
//Node* p = new Node();
// nwew Node;这样也是正确写法;
// Node();正确写法
// Node;错误写法------------------------------区别是什么呢?
//head = p;
head = new Node();
//head->next = nullptr;
//new出来的东西在堆空间,不会快速回收;
//析构函数还有删除节点都是要删除释放new的内存的;不然都不会自动回收;
};
void addNode(Node s) {
Node p = new Node(s);//这里是用了系统自带的拷贝构造函数?因为不确定s存在哪里,什么时候回收;所以这样写-------------------指针也该再回炉了
p->next = head->next;
head->next = p;
}
void deleteNode(string id) {//链表里删除某一节点是依靠某一特殊值,这里是靠id;(前提是id唯一)
Node* q = head;//伴随指针,永远指着p指向的上一个节点;可以防止单向链表不容易往回走导致的难以删除节点的问题
Node* p = head->next;
while (p!=nullptr) {
if (p->id == id) {
q->next = p->next;
delete p;
//break;id唯一时候直接跳出即可
p = q->next;//p又在q前重新生成了
}
else
{
p = p->next;
q = q->next;//并不改变链表这里,这里只会影响pq指向什么
}
}
}
void modifyNode(string id, int age)
{
Node* p = head->next;
while (p != nullptr)
{
if (p->id == id)
{
p->age = age;
//break;id唯一时候直接跳出即可
}
p = p->next;
}
}
void traverse()
{
Node* p = head->next;
while (p != nullptr)
{
p->display();
p = p->next;
}
}
~Link()//new出来的都要自己删除
{
Node* p = head;
Node* q = nullptr;//wrong time error 运行时错误,不代表编译错误,可能是访问到了空指针指向的地址;re,还有除数为0,数组下标溢出都会导致运行时错误;
while (p != nullptr)
{
q = p->next;
delete p;
Node* p = q;
}
}
};
int main() {
int* p;
p = nullptr;//空指针;nullptr专指空指针防止乱用,易于记住;空指针位于链表末端;
}
标签:Node,10,head,16,nullptr,链表,next,2024,id From: https://www.cnblogs.com/szxworld/p/18471107