链表是一种动态数据结构,可以用来表示顺序访问的线性群体。
链表是一系列结点组成,节点指向下一个结点的地址
单链表:链表每一个结点中只有一个指向后继结点的指针
双链向表:每个结点中有两个用于连接其他结点的指针,一个指向前趋结点(称前趋指针),拎一个指向后继结点(称后继指针)
结点类
结点包括数据域和指针域,数据域用于存放元素内容,元素的内容既可以是若干数据类型,也可以是自定义的类型的数据
结点域用于存放链表中另一个结点的地址
#include<iostream>
using namespace std;
class Point {
int data; //数据
Point* next;//指针域
public:
int getdata();
void setdata(int data);
Point* getnext();
void setnext(Point* next);
};
int Point::getdata() {
return data;
}
void Point::setdata(int data) {
this->data = data;
}
Point* Point::getnext() {
return this->next;
}
void Point::setnext(Point* next) {
this->next = next;
}
class List { //构造函数
Point* head;
int size;
public:
List();
bool add(int data);
bool del(int posi);
bool insert(int posi, int data); //插入
int find(int posi); //遍历
};
List::List() {
head = NULL;
size = 0;
}
添加元素分为在头结点添加,和在非节点添加
bool List::add(int data) {
Point* p = new Point(); //new一个对象指针
p->setdata(data); //p的数据域传进来
if (head == NULL) {
head = p;
size++;
return 1;
}
else {
Point* q = head; //创建指针q指向头结点
给节点添加
通过for循环找到结点位置
for (int i = 0; i < size - 1; i++) {
q = q->getnext();
}
q->setnext(p);
size++;
return 1;
}
}
bool List::del(int posi) {
if (posi<0 || posi>size) { //判断位置是否合法
return "del error";
}
删除头节点,直接把头节点指向头节点的下一个结点就可以了,然后删除头节点
删除非头结点:要找到要删除的前一个结点,要将指针指向它的结点的下一个结点,然后删除结点就行了
删除尾结点:遍历找到尾结点的前一个结点
//如果删除结点为头结点
Point* q = head;
if (posi == 0) {
head = q->getnext();
size--;
delete(q);
return 1;
}
//是你拿出结点为尾结点
if (posi == size) {
for (int i = 0; i < posi - 1; i++) { //找到倒数第二个结点
q = q->getnext();
}
delete(q->getnext());
return 1;
}
//删除非头结点
else {
for (int i = 0; i < posi - 1; i++) {
q = q->getnext();
}
Point* a = q->getnext(); //指向我们要删除的结点
q->setnext(q->getnext()->getnext());
delete(a);
size--;
return 1;
}
}
bool List::insert(int posi, int data) {
if (posi<0 || posi>size) { //判断位置是否合理
return "del error";
}
Point* p = new Point();
p->setdata(data);
Point* q = head;
//如果插入为头结点
if (posi == 0) {
p->setnext(q);
head = p;
size++;
return 1;
}
else { //出入不是头结点
for (int i = 0; i < posi - 1; i++)
q = q->getnext();
p->setnext(q->getnext());
q->setnext(p);
size++;
}
}
int List::find(int posi) {
if (posi<0 || posi>size) {
cout << "del error" << endl;
return 0;
}
Point* p = head;
for (int i = 0; i < posi; i++) {
p = p->getnext();
}
return p->getdata();
}
int main() {
List l = List();
l.add(1);
l.add(3);
l.add(3);
l.add(4);
l.add(5);
l.add(6);
cout << "改变前:" << endl;
for (int i = 0; i < 6; i++) {
cout << l.find(i) << " ";
}
cout << endl;
l.insert(1, 2);
l.del(3);
cout << "改变后:" << endl;
for (int i = 0; i < 6; i++) {
cout << l.find(i) << " ";
}
}