关于链表 求大神解答下

lovelisy 2014-04-25 12:28:07
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;
PNODE Pnew=(PNODE)malloc(sizeof(NODE));
if(Pnew==NULL)
{
printf("内存分配失败");
exit(-1);
}
Pnew->data=val;
PNODE q=P->Pnext;
P->Pnext=Pnew;
Pnew->Pnext=q;
return true;

}
这段代码可以实现在链表中插入一个新的节点,写的很牛,可我一直搞不明白它是如何实现的,能否有大神解答一下
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_hhm 2014-04-25
  • 打赏
  • 举报
回复
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; PNODE Pnew=(PNODE)malloc(sizeof(NODE)); //分配内存 if(Pnew==NULL) { printf("内存分配失败"); exit(-1); } Pnew->data=val; //将要插入的数据保存到新内存中 PNODE q=P->Pnext; //新建临时变量保存要插入位置的下一个位置 P->Pnext=Pnew; //插入数据 Pnew->Pnext=q; //新数据指向原位置的下一位置 return true; } 4楼+++++
buyong 2014-04-25
  • 打赏
  • 举报
回复
单步跟踪一遍,你就知道了
不良制品 2014-04-25
  • 打赏
  • 举报
回复
其实只要把握链表插入的原理,这个不难理解的吧。 如有链表: P1->P2->P3 现在要在P2后面插入P4, 那么就要定位到P2,记录P2的下一个节点P3 将P2的下一个节点指向P4,此时为 P = P3(P为一个临时记录) P1->P2->P4 在将P4的下一个节点指向记录的节点 P1->P2->P4->P3 这样就完成了链表的插入
杀意已决 2014-04-25
  • 打赏
  • 举报
回复
好吧, 反应过来了,留的接口应该是*PNODE 很好理解的.
tuzhutuzhu 2014-04-25
  • 打赏
  • 举报
回复
PNODE P=Phead; //定义变量P从链表头看是检索 while(NULL!=P&&i<pos-1) { P=P->Pnext; i++; } // 这段是从头开始检索链表,找到想要插入的位置pos PNODE Pnew=(PNODE)malloc(sizeof(NODE)); //分配新节点 // 为pos节点写入数据,并将新节点加入到链表中 Pnew->data=val; PNODE q=P->Pnext; P->Pnext=Pnew; Pnew->Pnext=q;
杀意已决 2014-04-25
  • 打赏
  • 举报
回复
循环找到要插入的位置,new一个节点,插入进去 确实也是写的很牛,我也是不能明白 PNODE P=Phead; P=P->Pnext; 这他妈也可以? 这几把也能编的过?
lovelisy 2014-04-25
  • 打赏
  • 举报
回复
引用 4 楼 u011623102 的回复:
其实只要把握链表插入的原理,这个不难理解的吧。 如有链表: P1->P2->P3 现在要在P2后面插入P4, 那么就要定位到P2,记录P2的下一个节点P3 将P2的下一个节点指向P4,此时为 P = P3(P为一个临时记录) P1->P2->P4 在将P4的下一个节点指向记录的节点 P1->P2->P4->P3 这样就完成了链表的插入
非常感谢
lovelisy 2014-04-25
  • 打赏
  • 举报
回复
引用 6 楼 s_hhm 的回复:
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; PNODE Pnew=(PNODE)malloc(sizeof(NODE)); //分配内存 if(Pnew==NULL) { printf("内存分配失败"); exit(-1); } Pnew->data=val; //将要插入的数据保存到新内存中 PNODE q=P->Pnext; //新建临时变量保存要插入位置的下一个位置 P->Pnext=Pnew; //插入数据 Pnew->Pnext=q; //新数据指向原位置的下一位置 return true; } 4楼+++++
感谢!我才开始学数据结构
jay0518 2014-04-25
  • 打赏
  • 举报
回复
这就是链表节点插入的一个常规实现而已。 没明白到底牛在哪?
tbwork 2014-04-25
  • 打赏
  • 举报
回复
真的很牛!!!
LouisScola 2014-04-25
  • 打赏
  • 举报
回复
这有什么牛的,这不是标准的链表节点插入写法吗

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧