双向链表
链表的组成:链表由一系列**结点**组成
结点的组成:一个是存储数据元素的**数据域**,另一个是存储下一个结点地址的**指针域**
STL中的链表是一个双向循环链表
 
 
构造函数


List 赋值和交换

 
容器大小操作
- 判断是否为空 --- empty
- 返回元素个数 --- size
- 重新指定个数 --- resize
 
 
插入和删除
* 尾插 --- push_back
* 尾删 --- pop_back
* 头插 --- push_front
* 头删 --- pop_front
* 插入 --- insert
* 删除 --- erase
* 移除 --- remove
* 清空 --- clear

数据存取
list <int > li;
li.front(); //第一个元素
li.back(); //最后一个元素
反转和排序
 

自定义排序案例,变量为类class
#include <list>
#include <string>
class Person {
public:
	Person(string name, int age , int height) {
		m_Name = name;
		m_Age = age;
		m_Height = height;
	}
public:
	string m_Name;  //姓名
	int m_Age;      //年龄
	int m_Height;   //身高
};
bool ComparePerson(Person& p1, Person& p2) {
//降序
	if (p1.m_Age == p2.m_Age) {
		return p1.m_Height  > p2.m_Height;
	}
	else
	{
	//升序
		return  p1.m_Age < p2.m_Age;
	}
}
void test01() {
	list<Person> L;
	Person p1("刘备", 35 , 175);
	Person p2("曹操", 45 , 180);
	Person p3("孙权", 40 , 170);
	Person p4("赵云", 25 , 190);
	Person p5("张飞", 35 , 160);
	Person p6("关羽", 35 , 200);
	L.push_back(p1);
	L.push_back(p2);
	L.push_back(p3);
	L.push_back(p4);
	L.push_back(p5);
	L.push_back(p6);
	for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
		cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age 
              << " 身高: " << it->m_Height << endl;
	}
	cout << "---------------------------------" << endl;
	L.sort(ComparePerson); //排序
	for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
		cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age 
              << " 身高: " << it->m_Height << endl;
	}
}
int main() {
	test01();
	system("pause");
	return 0;
}














![[OPEN SQL] SELECT语句](https://i-blog.csdnimg.cn/direct/65634126c0b14030934dfc72c4721dd1.png)
![[数据结构]动态顺序表的实现与应用](https://i-blog.csdnimg.cn/direct/f5c016efacaa400b8762ad82e844ebfc.png)


