数据结构与算法(C++)--链表

线性表的链性存储结构

线性表中的数据元素(结点)在存储器的位置是任意的,即逻辑上相邻的数据元素在物理位置上不一定相邻

结点

在这里插入图片描述

链表

n个结点由指针链组成一个链表

单链表的基本操作

单链表的初始化

构造一个空表
在这里插入图片描述
步骤:
生成新结点作为头结点,用头指针L去指向头结点
将头结点的指针域置空

Status InitList_L(LinkList &L){
	L = new LNode;
	L->next=NULL;
	return OK;
}

补充: 判断链表是否为空

int ListEmpty(LinkList L){

> 		if(L->next)//非空
> 			return 0;
> 		else
> 			return 1;
> }

补充:单链表的销毁
在这里插入图片描述
首先让 P =L
然后将L的下一个地址赋值给L,L = L->next
然后就可以放心删除(释放)前一个数据了,delete P
就这样依次释放所有结点,直到 L==NULL

Status DestroyList_L(LinkList &L){
	Lnode *p
	while(L){
	p=L;
	L = L->next;
	delete P;
	}
}

补充:清空链表,链表依然存在,只是没有元素了。只剩下头指针和头结点
在这里插入图片描述
首先将首元结点赋值给p,p= L->next
在这里插入图片描述
这时候引入另外一个指针,记录p结点的下一个结点的数据。q=p->next
然后就可以放心删除p结点了。delete p
接下来反复执行:
p=q
q = q->next
结束条件:p==NULL
循环条件:p!=NULL

Status ClearList(LinkList &L){
	Lnode *p,*q;
	p =L->next;
	while(p){
		q = p->next;
		delete p;
		p=q;
	}
	L->next ==NULL;
	return OK;
}

补充:求链表的表长

int ListLength_L(LinkList L){
	LinkList p;
	p = L->next;//p指向第一个结点
	int i =0;
	while(p){         //遍历链表统计结点数
		i++;
		p =p->next;
	}
	return i;
}

补充:取单链表第i个元素的内容
由于链表不是随机存取结构
所以必须从头指针出发,顺着next逐个结点往下找,直到第i个为止

Status GetElem_L(LinkList L,int i,ElemType &e){
	p =L->next; j =1;//初始化
	while(P&&j<i){    //向后扫描,直到p指向第i个节点或p为空
		p=p->next;j++;
	}
	if(!p丨丨j>i) return error;//第i个不存在
	e=p->data;//取第i个元素
	return ok;
}

链表的查找–按值查找,时间复杂度为O(n)
步骤:
从第一个结点开始,一次和e相比较
如果找到一个值和e相等,则返回他的位置或者地址
如果找遍了都没找到,则返回0或者null

Lnode*LocateElem_L(LinkList L,ElemTpe e){
	p = L->next;
	while(p&&p->data!=e)
		p=p->next;
	return 0;
}

插入–在第i个结点前插入一个e结点 时间复杂度为O(1)
步骤:
首先要找到第i-1个结点的存储位置p
生成一个数据域为e的新结点s
新结点的指针域指向a_i s->next = p->next
结点a_i-1的指针域指向新结点 p->next = s

Status Listinsert_L(LinkList&L,int i,ElemType e){
	p=L;j=0;
	while(p&&j<i-1){p=p->next;++j}//寻找第i-1个结点,p i-1结点
	if(!p丨丨j>i-1)return error;//i大于表长+1或者下于1,插入位置非法
	s= new LNode;
	s->data=e;//生成新结点s,数据域为e
	s->next = p->next;
	p->next = s;
	return ok;
}

删除第i个结点 时间复杂度为O(1)
步骤:
首先找到第a_i-1的存储位置p,保存要删除的a_i的值
令p->next = a_i+1
p->next = p->next->next

在这里插入图片描述

Status ListDelete_L(LinkList &L,int i,ElemTpye &e){
	p=L;j=0;
	while(p->next&&j<i-1){p=p->next;++j;}//寻找第i个结点,令p指向其前驱
	if(!(p->next)丨丨j>i+1) return error;//删除位置不合理
	q = p->next;//临时保存被删结点,以备释放
	p->next=  q->next;//改变删除结点的前驱结点的指针域
	e = q->data;//保存删除结点的数据域
	delete q;//释放删除结点的空间
return ok;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值