bool insert_list(strcut node * pHead ,int pos ,int val)
struct node * p = pHead;
int i = 0; //注意i 的值就是p指向的链表的实际位置,此时p指向头结点(不是头结点的指针域)i=0
while(NULL != p&&i < pos-1)
{
p = p->next;
i++;// p指向第一个节点 ,i=1。p指向第n个节点,i=n。(这两步没有先后顺序,视为同时进行的 *** 作,所以如果i=pos-1,p就指向第pos-1个节点)
}
if(i > pos-1 || p = NULL)
return false;
一、为什么p是从头结点开始的
当pos=1时,要找pos-1位置即头结点,如果 p->pHead->pNext 那么指针已经指向第一个节点,无法对pos-1(头结点)的指针域 *** 作,也就无法插入一个新节点。
二、while循环,&&语句只要有一个不成立,就退出。一共有三种情况。假设A条件为 NULL!=p,B条件为i < pos-1。
1、A不成立,B不成立
A不成立就是p指向了NULL,B不成立就是i=pos-1。
意思是p指向了NULL,并且p指向的位置是pos-1,画图可以看出这个条件是无法进行插入的。
2、A不成立,B成立
A不成立就是p指向了NULL,B成立就是说i 意思是在pos-1的位置前就有节点指向NULL,比情况1还要离谱一点。 3、A成立,B不成立 A成立就是p并未指向NULL,B不成立就是说i=pos-1。 意思是p指向的节点非空,并且p指向的位置是pos-1,满足插入的条件。 三、if语句 i > pos-1这个条件主要为了排除pos为负数的情况,i的目的就是为了寻找pos-1的位置,i>pos-1的话i本身也没什么意义。 p==NULL排除了上面while循环的前两种情况,保留最后一种情况。 执行完循环和if语句后,p指向pos-1这个位置且pos-1不为NULL,符合插入的条件。 四、随便说几句 以上均为我个人的理解,写这个一是为了以后回顾,二是希望能帮助到不理解这个算法的人。我也是初学这个算法,以上如果有错误之处,麻烦大家指正,防止我这个新手误导了别人。本文如果能帮助到你,我会很开心的。 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)