数据结构之单链表

视频: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;
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值