鱼C论坛

 找回密码
 立即注册
查看: 3047|回复: 1

帮我看看这个删除链表的程序,为什么最后一个删除不掉呢?

[复制链接]
发表于 2013-3-2 15:28:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 名人堂_丿_帅 于 2013-3-3 07:42 编辑
  1. /*
  2. 这个程序的功能建立一个链表,删除用户想要删除的数据,再输出
  3. 可是为什么最后一个删除不掉呢???
  4. */

  5. # include <stdio.h>
  6. # include <stdlib.h>
  7. # include <malloc.h>

  8. struct Node
  9. {
  10.         int delta;  //数据域
  11.         struct Node * pNext;  //指针域
  12. };

  13. struct Node * create_list(void);
  14. void traverse_list(struct Node * pHead);
  15. struct Node * shanchu_list(struct Node * pHead);

  16. int main(void)
  17. {
  18.         struct Node * pHead = NULL;

  19.         pHead = create_list();  //create_list();函数的功能,创建一个非循环单链表并将链表的头结点

  20. 返回给pHead
  21.         printf("\n");
  22.         shanchu_list(pHead);
  23.         printf("\n");
  24.         traverse_list(pHead);   //输出链表里的值

  25.         return 0;
  26. }

  27. struct Node * create_list(void)
  28. {
  29.         int len; //用来存放有效节点的个数
  30.         int val; //用来临时存放用户输入的节点的值
  31.         int i;

  32.         //分配一个不存放有效数据的节点
  33.         struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));  //pHead保存了该不存放

  34. 有效数据的结点的地址
  35.         if (NULL == pHead)  //判断是否分配成功
  36.         {
  37.                 printf("分配失败,程序终止!\n");
  38.                 exit(-1);
  39.         }
  40.         struct Node * pTail = pHead;  //pTail也保存了该不存放有效数据的结点的地址
  41.         pTail->pNext = NULL;          //使pTail->pNet这个成员为NULL(空)

  42.         printf("请输入您需要生成的节点数:len = ");
  43.         scanf("%d", &len);

  44.         for (i=0; i<len; ++i)
  45.         {
  46.                 printf("请输入第%d个节点的值:", i+1);
  47.                 scanf("%d", &val);

  48.                 struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));  //创建第一个结


  49.                 if (NULL == pNew)  //判断链表是否分配成功
  50.                 {
  51.                         printf("链表分配失败,程序终止!\n");
  52.                         exit(-1);  //终止程序
  53.                 }
  54.         
  55.                 pNew->delta = val;  //val中的值赋给第一个结点的有效数据
  56.                 pTail->pNext = pNew;  //pTail->pNext存放了pNew的地址,pTail->pNext指向pNew
  57.                 pNew->pNext = NULL;
  58.                 pTail = pNew;
  59.         }

  60.         return pHead;
  61. }

  62. void traverse_list(struct Node * pHead)  //保存了链表的头结点的地址,因此pHead相当于链表的头指针
  63. {
  64.         struct Node * p = pHead->pNext;
  65.         
  66.         printf("输出:\n");
  67.         while (NULL != p)
  68.         {
  69.                 printf("%d\n", p->delta);
  70.                 p = p->pNext;
  71.         }

  72.         return;
  73. }

  74. struct Node * shanchu_list(struct Node * pHead)
  75. {
  76.         struct Node * p1;
  77.         struct Node * p2;
  78.         int biaozhi = 0;
  79.         int val;

  80.         p1 = pHead; p2 = pHead;
  81.         printf("请输入您要删除的数据:val = \n");
  82.         scanf("%d", &val);
  83.         while (p1->pNext != NULL)
  84.         {
  85.                 if (p1->delta == val)
  86.                 {
  87.                         ++biaozhi;
  88.                         if (p1 == pHead)
  89.                         {
  90.                                 pHead = p1->pNext;
  91.                                 p2 = p1;
  92.                                 p1 = p1->pNext;
  93.                         }
  94.                         else
  95.                         {
  96.                                 p2->pNext = p1->pNext;
  97.                                 p1 = p1->pNext;
  98.                                 
  99.                         }        
  100.                 }
  101.                 else
  102.                 {
  103.                         p2 = p1; p1 = p1->pNext;
  104.                 }
  105.         }
  106.         if (biaozhi == 0)
  107.         {
  108.                 printf("您要删除的数据不存在!\n");
  109.         }


  110.         return pHead;
  111. }


  112. /*
  113. 在VC++6.0中输出结果:
  114. -------------------------
  115. 请输入您需要生成的节点数:len = 5
  116. 请输入第1个节点的值:1
  117. 请输入第2个节点的值:5
  118. 请输入第3个节点的值:3
  119. 请输入第4个节点的值:5
  120. 请输入第5个节点的值:5

  121. 请输入您要删除的数据:val =
  122. 5

  123. 输出:
  124. 1
  125. 3
  126. 5                               //为什么这个5没有被删除???
  127. Press any key to continue
  128. -------------------------
  129. */
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-17 09:28:08 | 显示全部楼层
知道了,原来第103行要改成while (p1 != NULL)
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-10 16:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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