①思路
三个工作指针
q→s→p
q指向插入位置的前趋结点
s指向新开辟的结点
p指向插入的位置
~
②源程序与分析
#include< stdio.h>
#include< stdlib.h>
struct slist
{int data;
struct slist *next;
/*结构体有两个成员 ,
数据成员data用于储存数据 ,
指针成员 next用于指向下一个数据 , 形成链表 。 */
typedef struct slist SLIST;
/*typedef说明结构体的新类型SLIST , single list 单向链表 。 */
insert snode(SLIST *headint xint y)
/*函数名insert snode=insert single node即插入单向结点 。
函数有三个变量 , head头结点 , x插入位置 , y插入结点 。 */
{SLIST *s*p*q;
/*三个基类型为结构体类型的工作指针 。
回到开头的思路q→s→p 。 */
s=(SLIST *)malloc(sizeof(SLIST));
/*malloc函数分配 size个字节的储存区 , sizeof表示不确定字节数 , 即为新插入结点s分配储存空间 。 */
s->data=https://mparticle.uc.cn/api/y;
/*新结点存入值y 。 */
q=head;
/*q为头指针 , 此处没有为头结点分配储存空间 , 也没有定义头结点地址为head太多了不展开 。 */
p=head->next;
/*p指向头结点后的第一个结点 , 为后面的遍历做准备 。 */
while((p!='\\0')&&(p->data!=x))
/*该循环用于遍历查找x 。
循环条件是p不为空且未到表尾 , 且p没指向x , 一旦指向x就结束循环 。
【c语言|C语言-结构体单向链表插入结点】不能交换顺序 ,
(p->data!=x)&&(p!='\\0') , 如果p已经指向表尾且为空 , 执行p->data会导致访问虚地址的错误 。 */
{q=p;
/*遍历:前趋结点不断更新为插入结点 。 */
p=p->next;
/*遍历:插入结点不断后移 。 */
s->next=p;
q->next=s;
/*当链表为空表时(不进入循环):
不存在插入位置x , 执行p=head->next时 , p为空 , 不满足循环条件 , 不会进入循环 。 执行s->next=p和q->next=s , 插在表尾 。
当链表非空时(进入循环):
若不存在插入位置x , 循环函数while无法查询到x , 遍历直到表尾p=='\\0'退出循环 。 执行s->next=p和q->next=s , 插在表尾 。
若存在插入位置x , 循环函数while查到 x , p!='\\0'成立 。 执行s->next=p和q->next=s , 插在x结点之前 。 */
- 荣耀Play 6T Pro上手体验,超大内存千元5G全能选手
- 自媒体|自媒体人ip造假,大量自媒体人翻车,揭秘背后的真相
- javascript|别人做自媒体赚得盆满钵满,你发作品却没收益?这5个细节要注意
- 在4月28日的华为折叠旗舰及全场景新品发布会上|华为折叠手机体验大升级
- IT之家4月30日消息|中兴axon40系列将搭载立体声效扬声器
- 全面屏|OPPO新旗舰曝光,一体全面屏+台积电骁龙芯+5000mAh,实力很强
- 分期付款|线下实体店很多,为什么更多人愿意在网上买手机?原来差距这么大
- 自媒体|新手小白什么都不会,怎么做自媒体赚钱?
- 相机|vivoX80实际上手体验如何,是否值得入手?
- 三星Galaxy|三星Galaxy S23+放大招,携手一体全面屏逆袭,真的很强