Twitter|C语言-结构体单向链表插入结点

Twitter|C语言-结构体单向链表插入结点


①思路
三个工作指针
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就结束循环 。
不能交换顺序 ,
(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 , 插在表尾 。
【Twitter|C语言-结构体单向链表插入结点】若存在插入位置x , 循环函数while查到 x , p!='\\0'成立 。 执行s->next=p和q->next=s , 插在x结点之前 。 */