数据结构- -线性表- -单链表

本文介绍了单链表的概念,特点以及常见的操作,包括初始化、清空、销毁、判断链表状态、获取长度、查找、插入和删除等。单链表在数据元素的插入和删除上具有高效性,但查找通常需要从头开始。链表的存储结构包括头结点和数据域,其中头结点用于指向链表的第一个数据结点。文章还探讨了链表的空间和时间效率。
摘要由CSDN通过智能技术生成

顺便提一下,之前说的顺序存储结构由于其两个元素在物理位置上相邻,故它的优点是很方便存取,但与此带来的缺点是如果进行插入或者删除操作的话,需要移动大量的元素,在工程量大的时候,很耗时间。链式存储结构不要求元素的物理位置相邻,不存在顺序存储的弱点,但也同时失去顺序表可随机存取的优点。


目录

初始化

清空链表

销毁链表

判断链表是否为空

获取长度

按位置查找后返回其值

返回满足条件的位置

找所查元素的前驱

找所查元素的后继

数据元素的插入

数据元素的删除

逆位序输入

两个链表的合并


对于链表的数据元素,它除了要存储本身的信息外,还要存储一个能够指示其直接后继的信息(即指向后继的存储位置),逻辑上称这部分数据元素为结点,结点包括两个域:数据域,主要存储本身的数据元素信息。指针域,是用来存储其直接后继的存储位置,这部分信息称作指针。链表一般分为:单链表(结点只有一个指针域的链表)、双链表(有两个指针域的链表)、多链表(有多个指针域的链表)、循环链表(首尾相接的链表),一般都是说的单链表。

单链表的特点:

  1. 数据元素的逻辑顺序和物理顺序不一定相同。
  2. 在查找数据元素时,必须从头指针开始依次查找,表尾的指针域指向NULL。
  3. 在特定的数据元素之后插入或删除元素,不需要移动数据元素,因此时间复杂度为 O(1)。
  4. 存储空间不连续,数据元素之间使用指针相连,每个数据元素只能访问周围的一个元素。
  5. 长度不固定,可以任意增删。

单链表的存取必须从头指针开始进行,头指针表示指向链表中第一个结点(头结点或者首元结点)的指针,是一个具体的地址,同时,由于最后一个数据元素没有直接后继,链表最后一个结点的指针应设为“空”(NULL),其长度变化较大,主要用于插入和删除操作。

为了增加可读性,一般我们在单链表的第一个结点前附设一个结点,称作头结点,头结点的数据域可以不存任何信息,也可以存储如线性表的长度等类的附加信息,头结点的指针域存储指向第一个结点的指针(即第一个数据元素的存储位置)。首元结点是指链表中存储单链表第一个数据元素的结点。

 

其链表的存储结构为:

typedef int Status;
typedef int ElemType;
typedef struct LNode{
	ElemType data ;
	struct LNode *next ;
}LNode,*LinkList;

初始化

为头结点构造一个空间

Status InitList(LinkList &L){
	L = (LinkList)malloc(sizeof(LNode));
	if(!L)
		exit(OVERFLOW) ;
	L->next=NULL ;
}

清空链表

前提是链表已存在(后续操作均在此基础上进行)

Status ClearList(LinkList &L){
	if(L==NULL){
		cout<<"该链表不存在。"<<endl;
		return TRUE;
	}
	LinkList p ,q ;
	p=L->next;
	while(p!=NULL){
		q=p ;
		p=p->next;
		free(q);
	}
	L->next=NULL; 
	//cout<<"链表已被清空。"<<endl;
	return TRUE ;
}

销毁链表

和清空不同的是注意要把头结点一块销毁。

Status DestroyList(LinkList &L){
	LinkList p,q ;
	p=L;
	while(p){
		q=p->next;
		free(p);
		p=q;
	}
	L=NULL ;
	return TRUE ;
}

判断链表是否为空

Status ListEmpty(LinkList L){
	if(L->next==NULL){
		cout<<"链表是空的。"<<endl;
		return TRUE ;
	}
	else{
		cout<<"链表中尚有数据元素,不是空表。"<<endl;
		return FALSE ;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值