【线性表的查找,线性表插入,线性表的删除,线性表的链式表示和实现】

文章目录

  • 线性表的查找
  • 线性表插入
  • 线性表的删除
  • 线性表的链式表示和实现
    • 1.单链表,双链表,循环列表
    • 2.头指针,头结点和首元结点
    • 3.链表的存储结构特点

线性表的查找

int LocateElem(Sqlist L,ElemType e){
//在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
	for(i = 0;i < L.length;i++)
		if(L.elem[i] = = e) return i + 1;//查找成功返回其序号
			return 0;//查找失败,返回0
}

线性表插入

Status ListInsert_Sq(SqList &L,int i,ElemType){
	if(i < 1 || i > L.length + 1)	return ERROR;//i值不合法
	if(L.length == MAXSIZE)	return ERROR;//当前存储空间已满
	for(j = L.length - 1;j >= i-1;j--)
		L.elem[j+1] = L.elem[j];	//插入位置及以后的元素后移
	L.elem[i-1] = e;	//将新元素e放入第i个位置
	L.length++;		//表长加一
	return OK;
	
}

线性表的删除

Status ListDelete Sq(SqList &L,int i){
	if((i<1)||(i>L.length))	return ERROR;
	for(j=i;j<=L.length-1;j++)
		L.elem[j-1]=L.elem[j];	//被删除元素之后的元素前移
		L。length--;
	return OK;
}

删除算法演示:
①删除位置在最后(直接删除)
②删除位置在中间(找到要删除的,后面的元素覆盖前面的元素)
③删除位置在最前面(从第二个元素到最后一个元素一直覆盖)

线性表的链式表示和实现

1.用一组物理位置任意的存储单元来存放线性表的数据元素。
2.这组存储单元可以是连续的,也可以是不连续的,甚至可以是零散分布在内存中的任意位置的。
3.链表的逻辑次序和物理次序不一定相同。

单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名。

对数据元素来说,除了存储本身的信息之外,还需存储指示其直接后继的信息。这两部分组成了数据元素的存储映像,成为结点
结点包括两个域,集中存储数据元素信息的域称为数据域,存储直接后继存储位置的域叫做指针域。n个节点的存储映像链接成为一个链表。又因为此链表的每个节点中只包含一个指针域,故称为线性链表和单链表。

1.单链表,双链表,循环列表

  • 结点只有一个指针域的链表,称为单链表或线性链表。

【线性表的查找,线性表插入,线性表的删除,线性表的链式表示和实现】_第1张图片

  • 结点有两个指针域的链表,称为双链表
    【线性表的查找,线性表插入,线性表的删除,线性表的链式表示和实现】_第2张图片

  • 首尾相接的链表称为循环链表
    【线性表的查找,线性表插入,线性表的删除,线性表的链式表示和实现】_第3张图片

2.头指针,头结点和首元结点

【线性表的查找,线性表插入,线性表的删除,线性表的链式表示和实现】_第4张图片

头指针:是指向链表的第一个指针。
首元结点:是指链表中存储的第一个数据元素a1的结点。
头结点:是在链表的首元结点之前附设的一个结点。

如何表示一个空表
无头结点,头指针为空时表示空表。
有头结点,当头节点的指针域为空时表示空表。

在链表中设置头结点的好处
便于首元结点和空表的处理。

3.链表的存储结构特点

存储位置任意(顺序存取法)
通过头指针找到链表,并通过每个节点的指针域依次向后顺序扫描其节点。

typedef struct Lnode{//声明结点的类型和指向结点的指针类型
	ElemType	data;//结点的数据域
	struct	Lnode	*next;//结点的指针域
}Lnode,*LinkList;	//LinkList为指向结构体Lnode的指针类型。

定义链表:LinkList L;
定义结点指针p:LNode *p;LinkList p;

你可能感兴趣的:(数据结构)