文章目录
- 线性表的查找
- 线性表插入
- 线性表的删除
- 线性表的链式表示和实现
- 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.单链表,双链表,循环列表
- 结点只有一个指针域的链表,称为单链表或线性链表。
-
结点有两个指针域的链表,称为双链表。
-
首尾相接的链表称为循环链表。
2.头指针,头结点和首元结点
头指针:是指向链表的第一个指针。
首元结点:是指链表中存储的第一个数据元素a1的结点。
头结点:是在链表的首元结点之前附设的一个结点。
如何表示一个空表
无头结点,头指针为空时表示空表。
有头结点,当头节点的指针域为空时表示空表。
在链表中设置头结点的好处
便于首元结点和空表的处理。
3.链表的存储结构特点
存储位置任意(顺序存取法)
通过头指针找到链表,并通过每个节点的指针域依次向后顺序扫描其节点。
typedef struct Lnode{//声明结点的类型和指向结点的指针类型
ElemType data;//结点的数据域
struct Lnode *next;//结点的指针域
}Lnode,*LinkList; //LinkList为指向结构体Lnode的指针类型。
定义链表:LinkList L;
定义结点指针p:LNode *p;LinkList p;