C语言中的一个思路问题!求教

//在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
bool insert_list(PNODE pHead, int pos, int val)
{
int i = 0;
PNODE p = pHead;
while (NULL!=p && i<pos-1)
{
p = p->pNext;
++i;
}
if (i>pos-1 || NULL==p)
return false; //如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓
//分配新的结点 PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态分配内存失败!\n");
exit(-1);
}
pNew->data = val; //将新的结点存入p节点的后面
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
这个是数据结构中链表功能的实现中的一个函数,函数我看得懂
while (NULL!=p && i<pos-1)
{
p = p->pNext;
++i;
}
if (i>pos-1 || NULL==p)
return false;,但是我不懂得这个思路是如何来的??高手请给点建议!

你这个函数是用作插入新节点并为之赋值的,最后返回一个bool的判定是否成功;
参数如下3个:
PNODE pHead,:结构体指针头,即链表头指针
int pos:链表长
int val:新指针的data值

过程如下:
while (NULL!=p && i<pos-1)
{
p = p->pNext;
++i;
}
if (i>pos-1 || NULL==p)
此部分用于找到指针尾(作为普通指针,只有Head头指针,没有尾指针)
p即为头指针,NULL!=p&&i<pos-1是while的判定出口,是为了循环判定以及防止出现指针溢出的,

由于你定义i=0; 链表长是pos 那么你从0开始数,当数到pos-1刚好是pos个数,
若NULL!=p&&i<pos,会导致p位于一个未经定义的空区域,刚好越链表界,导致下面的动态分配空间出错(malloc)

找到指针尾之后,进行节点插入:
首先,动态分配节点空间,大小为结构体PNODE大小,再做一个出错判定
PNODE pNew = (PNODE)malloc(sizeof(NODE));

然后,添加节点:
pNew->data = val; //将新的结点存入p节点的后面
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;

至此,可以返回成功的布尔值了;

另,我猜兄台你正在看考研数据结构吧。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-26
首先说 if (i>pos-1 || NULL==p) 的意义:
i > pos -1是防止别人输入的pos参数为0或者负数。这都与题意不符合。
NULL == p呢,是防止整个链表的长度都还没有pos长,即不存在pos这个位置可以插入。
如果条件都合法的话,while循环执行完,刚好i == pos -1,而p呢也刚好指向pos位置结点的前一个位置。即在该点插入新的结点。
这样的话就应该明白了。本回答被提问者和网友采纳
相似回答