鱼C论坛

 找回密码
 立即注册
查看: 5501|回复: 8

链表的指针赋值(链表的删除)

[复制链接]
发表于 2012-9-22 20:04:38 | 显示全部楼层 |阅读模式
3鱼币
struct student *del( struct student *head, int num)
{
      struct student *p1, *p2;
      
      if( NULL == head )
      {
            printf("\nThis list is null!\n");
            goto end;
      }
      
      p1 = head;
      while( p1->num != num && p1->next != NULL)
      {
            p2 = p1;                            //  这里  p2=p1 是把p1的地址赋给p2 (p1=p2后 p1还是指向p1所指向的地址对吗  应该对)
            p1 = p1->next;                      //为什么p1又指向p1.next  (把p1.next赋给p1  p2的指向会变吗  为什么?  !!!)
      }
      if( num == p1->num )
      {
            if( p1 == head )
            {
                  head = p1->next;
            }
            else
            {
                  p2->next = p1->next;
            }
            
            printf("Delete No: %d succeed!\n", num);
            n = n-1;
      }
      else
      {
            printf("%d not been found!\n", num);
      }
      
end:
      return head;
}

最佳答案

查看完整内容

每次只能执行一条语句,所以p1=p1->next;不会改变p2的值!只要没有执行p2=p1,p2指针变量内存的指针就不会发生改变!多多用F10,调试程序,是解决问题的捷径之一!让p2发生指向变化的条件是要执行p2=p1这条语句!当没有执行时,就不会发生变化!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-22 20:04:39 | 显示全部楼层
本帖最后由 akon 于 2012-9-22 22:32 编辑

每次只能执行一条语句,所以p1=p1->next;不会改变p2的值!只要没有执行p2=p1,p2指针变量内存的指针就不会发生改变!多多用F10,调试程序,是解决问题的捷径之一!让p2发生指向变化的条件是要执行p2=p1这条语句!当没有执行时,就不会发生变化!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-22 20:20:47 | 显示全部楼层
     while( p1->num != num && p1->next != NULL)

      {

            p2 = p1;                          
  //  这里  p2=p1 是把p1的地址赋给p2 (p1=p2后 p1指向的地址为p2指向的地址)
            p1 = p1->next;                    
  //为什么p1又指向p1.next  (p1->p1->next;这个操作使指针指向了链表中的下一个接思节点,如while中的条件依然满足,则执行p2=p1操作!p2指针变量存的地址值会发生变化!)
      }

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-22 21:19:52 | 显示全部楼层
楼主看看能不能看懂。。

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-22 22:03:48 | 显示全部楼层
玩酷子弟lv 发表于 2012-9-22 21:19
楼主看看能不能看懂。。

木有说出俺想问的     
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-22 22:06:31 | 显示全部楼层
akon 发表于 2012-9-22 20:20
while( p1->num != num && p1->next != NULL)
      {
            p2 = p1;                       ...

(把p1.next赋给p1  p2的指向会变吗  为什么?  !!!)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-22 22:37:33 | 显示全部楼层
p2为什么要变?给一个变的理由呗。

p1和p2是两个指针。

2楼那样说是因为两个指针在while循环里。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-23 01:54:59 | 显示全部楼层
P2是为了记录要删除节点的前一个节点!!  因为前一个节点需要保存要删除节点里面所保存的一个节点~~ 这里P2是要删除节点的前一个  P1是要删除的节点 好好想想 分给我吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-23 08:35:53 | 显示全部楼层
首先,程序非常想直接写p1 = p1->next;
但是这一写法会导致p1指向的元素变为原先元素的下一个元素。这里的链表是单链表,就是只能向后遍历,不能向前遍历的。所以这样一些就悲催的,因为p1原先指向的元素再也获取不到了。

于是程序用了一个非常简单的办法,就是在p1 = p1->next;之前,用另一个变量p2把p1原先指向的位置保存下来;然后再改p1
改完后,p2是原先p1指向的位置,p1是原先p1指向的下一个位置。有了这两个位置才可能对单链表进行删除操作。具体流程看3L画的图。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表