数据结构线性表(二)之单链表读取、插入、删除

一.链式存储结构个人理解

数据元素不再考虑相邻位置,而是只要哪有空位就到哪,只要让每个元素知道下一位元素的位置就好(用到指针)

二.单链表相关概念推出

1.数据域:ai元素存储自身信息

2.指针域:ai元素存储指向后继元素存储位置的信息

3.结点:包含数据域和指针域

4.单链表:每个结点只包含一个指针域的线性表

5.头指针(要素):链表中第一个结点的存储位置(线性表最后一个结点指针为空)

6.头结点(非要素):单链表第一个结点前附设一个结点(其指针域指向第一个结点的指针)

(若线性表是空表则头结点的指针域为空)

三.单链表的存储结构

typedef' int ElemType;
typedef struct Node
{
ElemType data;//数据域
struct Node *next;//指针域
}Node;//Node==struct Node
typedef struct Node *LinkList;//定义链表LinkList.这里使得LinkList==struct Node *

四.解析p为第i个元素的指针

p->data//ai的数据域

p->next//指向i+1个元素,即ai+1的指针

p->next->data=ai+1

五.单链表的读取(思想:直到碰到想要的或者NULL停止)

思路:1.声明一个指针p指向第一个结点并初始化j=1

          2.j<i时遍历链表

          3.查找成功返回结点p数据(依靠e)

Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p;//LinkList作用上文有说明,这里是声明一指针p
p=L->next;//p指向链表L的第一个结点
j=1;
while(p&&j<i)
{
p=p->next;//让p指向下一个结点
++j;
}
if(!p||j>i)
return ERROR;
*e=p->data;//取第i个结点的数据
return OK;
}

六.单链表的插入


只需满足:s->next=p->next;p->next=s;(顺序固定)

思路:1.声明指针p指向表头结点并初始j=1

          2.j<i时遍历链表

          3.查找成功,系统生成一个空结点s

          4.将数据元素e赋值给s->data

          5.单链表插入标准语句:s->next=p->next;p->next=s;

/*初始条件:表L存在(建表下章会将),1<=i<=ListLength(L)*/
/*操作结果:在L中第i个结点位置之前插入新的数据元素e,L长加1*/
Status ListInsert(LinkList L,int i,ElemType e)
{
int j;
LinkList p,s;//这里声明指针p,s
p=*L;//与后面while匹配来判断是否为空表
j=1;
while(p&&j<i)
{
p=p->next;//让p指向下一个结点
++j;
}
if(!p||j>i)
return ERROR;
s=(LinkList)malloc(sizeof(Node));//生成新结点,类型与Node一样来放数据e的s结点
s->data=e;//e的值在单链表的读取中已经获取,或自己输入
s->next=p->next;
p->next=s;
return OK;
}

七.单链表的删除


实质:p->next=p->next->next

分解实质:q=p->next;p->next=q->next;

思路:1.声明指针p指向表头指针并初始j=1 

          2.j<i遍历链表

          3.看是否为空

          4.查找成功,q=p->next

          5.删除,p->next=q->next

          6.将q结点数据赋值给e(后面利用是释放p来删除e)

          7.释放p

/*初始条件:表L存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个结点并用e返回值,L长减1*/
Status ListDelete(LinkList L,int i,ElemType *e)
{
int j;
LinkList p,q;//这里是声明指针p,q,p》struct Node *p
p=*L;
j=1;
while(p->next&&j<i)
{
p=p->next;//指向下一个结点
++j;
}
if(!(p->next)||j>i)
return ERROR;//第i个结点不存在
q=p->next;
p->next=q->next;
*e=q->data;//将q结点的数据给e
free(q);回收此结点
return OK;

八.个人小想法

其实插入删除只要理解1.s->next=p->next;p->next=s;2.p->next=p->next->next这两句,其他的都是比较硬性规定的记住就好,在实际操作中用单链表的地方还是比顺序存储结构要多的,后面我会写很重要内容就是链表的整体创建这是执行插入删除等操作的前提

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值