视频:https://www.bilibili.com/video/av83732013/
线性表包括顺序表和链表两部分
顺序表:用一组地址连续的存储单元一次存储线性表的数据元素(数组)
链表:用一组任意的存储单元存储线性表的数据元素(存储单元可以是连续的,也可以是不连续的),对于每个数据元素除了存储本身信息外(数据域),还需存储指示其后继的信息(直接后继的存储位置)(指针域)称为结点,每个结点包含一个指针域,称为线性链表或单链表。
链表的创建,分为两种情况
第一种是整个链表一个结点都没有,head头指针为空,那么我们创建一个结点P,将头指针指向结点P,这个链表的头节点就创建完成了,第二种情况,若增加的结点并非头节点的话,我们只需要将指针Q指向整个链表的最后一个几点,将Q的next指向新创建的结点,便可以创建出一个任意长度的链表了
链表的删除,分为三种情况
第一种情况若删除的为头节点,我们只需要将head头指针指向next,将原来的头结点删除掉
第二种情况若删除的并非头节点,我们便需要找到要删除位置的前一个结点q,将q的next指向q的next的next,删除需删除的结点
第三种情况若删除的结点为尾结点,我们需要找到倒数第二个结点q,删除q的next结点便可以了
链表的插入,分为两种情况,新建一个结点newp
第一种情况,若插入处为头结点,需要将newp的next指向原来的头节点,然后将head指向结点newp
第二种情况,插入处为非头节点,我们需要找到要插入的位置的前一个结点fq,将新建的结点np的next指向fq结点的next,然后将fq的next指向新结点newp
下面贴代码
#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 length;
public:
List();
bool add(int data);
bool del(int posi);
bool insert(int posi, int data);
int find(int posi);
};
List::List(){
head = NULL;
length = 0;
}
bool List::add(int data){
Point *p = new Point();
p->setdata(data);
//1.头节点为空
if(head == NULL){
head = p;
length++;
return 1;
}else{
//2.非头结点
Point *q = head;
for(int i=0; i<length-1; i++)
q = q->getnext();
q->setnext(p);
length++;
return 1;
}
}
bool List::del(int posi){
if(posi<0 || posi>length)
return "del error";
//1.如果删除结点为头节点
Point *q = head;
if(posi == 0){
head = q->getnext();
length--;
delete(q);
return 1;
}
//2.删除结点为尾结点
if(posi == length){
for(int i=0; i<posi-1; i++){
delete(q->getnext());
return 1;
}
}else{
//3.删除结点并非头结点和尾结点
for(int i=0; i<posi-1; i++)
q = q->getnext();
Point *a = q->getnext();
q->setnext(q->getnext()->getnext());
delete(a);
length--;
return 1;
}
}
bool List::insert(int posi, int data){
if(posi<0 || posi>length)
return "del erroe";
Point *p = new Point();
p->setdata(data);
Point *q = head;
//1.如果插入处为头结点
if(posi == 0){
p->setnext(q);
head = p;
length++;
return 1;
}else{
//2.插入处并非头结点
for(int i=0; i<posi-1; i++)
q = q->getnext();
p->setnext(q->getnext());
q->setnext(p);
length++;
}
}
int List::find(int posi){
if(posi<0 || posi>length){
cout<< "del erroe"<<endl;
return 0;
}
Point *p = head;
for(int i=0; i<posi; i++)
p = p->getnext();
return p->getdata();
}
main(void){
List l = List();
l.add(8);
l.add(20);
l.add(19);
l.add(0);
l.add(1);
for(int i=0; i<5; i++)
cout<<l.find(i)<<endl;
l.insert(1,1);
l.del(2);
for(int i=0; i<5; i++)
cout<<l.find(i)<<endl;
}