关于链表的理解
今天没事嫖了下洛谷,让后打开了新手区寻求快感,做这道题花了一个多小时,半个小时都在检查,原来用的是容器(因为自动分配内存所以我经常用)然后出现了不可描述的错误和栈溢出,下午看数学的时候我想起了乐爷爷教的链表。下面是那道原题。
洛谷入门题地址
废话不多说,直接上代码
#include <iostream>
using namespace std;
struct square{ //定义结构,把他看作一个默认公有成员的类
int a , b , c,d ;
square*next=nullptr; //在该结构中定义下一个结构(因为后面想用动态分配
//所以用了指针)
square(int&ad,int&bd,int&cd,int&dd,square*next1)//定义了构造函数
{
a=ad;b=bd;c=cd;d=dd;
next=next1;
}
};
int main()
{
int e, f, g,h,n,x,y;
square *test =nullptr;//使用nullptr相当于初始化指针//c++11
cin>>n;
for(int i = 0 ; i<n;i++)
{
cin>>e>>f>>g>>h;
test = new square(e,f,g,h,test) ;//层层递进赋值
}
cin>>x>>y;
for(int i = 0 ; i < n ; i++)
{
if(test->a<=x&&test->a+test->c>=x&&test->b<=y&&test->b+test->d>=y){
int aa= n-i;
cout<<aa<<endl;
break;}
test=test->next;
}//层层退出查找
if(test==nullptr)//查找不到时的处理
cout<<-1<<endl;
delete test ;//遍历释放把,我太懒了
return 0;
}
总结
我个人的理解是,struct结构里面定义了下一个struct结构,在使用时可以不用定义默认构造函数而是给他的下一位取名字,如果经常要用到某个特定元素的话。
使用到复杂的构造或者成员函数时就是真正意义上的链表,因为struct结构每次定义时会赋给一个新的存储块,而这个存储块里面包含上一个存储块的地址,层层递进,所以叫做链表,一般的形象化理解是下一个的尾部接上一个的头部一串串连起来,访问时只能通过递归按次序访问每个元素。
昨天看了共同体union的详解后我才意识到关于内存分配了这一点。