查看: 1905|回复: 12
收起左侧

[其他相关] 实在没辙了,紧急求助啊

 关闭 [复制链接]
blue_仰望
发表于 2011-8-19 10:46:44 | 显示全部楼层 |阅读模式
本帖最后由 lniwn 于 2011-8-19 11:17 编辑
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct Node
  4. {
  5.     int data;
  6.     struct Node *pNext;
  7. }NODE, *PNODE;   //NODE等价于struct Node   PNODE等价于struct Node *

  8. PNODE create_list();   //创建一个非循环链表
  9. int traverse_list(PNODE pHead);  //遍历
  10. void sort_list(PNODE pHead, int len);   //排序
  11. int delete_list(PNODE, int);   //删除
  12. int insert_list(PNODE, int, int *);   //插入
  13. char is_empty(PNODE);

  14. int main()
  15. {
  16.     PNODE pHead = NULL;
  17.     int len = 0;


  18.     pHead = create_list();
  19.     len = traverse_list(pHead);
  20.     sort_list(pHead, len);
  21.     delete_list(pHead, len);
  22.     //insert_list(pHead, int, int *)

  23.     free(pHead);
  24.     return 0;
  25. }

  26. PNODE create_list()
  27. {
  28.     PNODE pNew;    //新建节点
  29.     PNODE pTail;   //表尾
  30.     PNODE pHead;  //表头
  31.     int len;
  32.     int i;

  33.     pHead = (PNODE)malloc(sizeof(NODE));
  34.     if(pHead == NULL)
  35.     {
  36.         printf("内存不足,程序退出!");
  37.         exit(-1);
  38.     }
  39.     pHead->data = 0; //初始化头节点
  40.     pHead->pNext = NULL;
  41.     pTail = pHead;
  42.     printf("请输入您需要生成的链表节点个数:len = ");
  43.     scanf("%d",&len);
  44.     for(i = 0; i < len; i++)
  45.     {

  46.         pNew = (PNODE)malloc(sizeof(NODE));
  47.         if(pNew == NULL)
  48.             {
  49.                 printf("内存不足,程序退出!");
  50.                 exit(-1);
  51.             }
  52.         printf("请输入第%d个数据:",i+1);
  53.         scanf("%d",&pNew->data);
  54.         pNew->pNext = NULL;
  55.         pTail->pNext = pNew;
  56.         pTail = pNew;

  57.     }
  58.     //free(pNew);
  59.     return pHead;

  60. }

  61. int traverse_list(PNODE pHead)
  62. {
  63.     PNODE p;
  64.     int len = 0;
  65.     p = pHead->pNext;
  66.     while(p != NULL)
  67.     {
  68.         printf("%d,",p->data);
  69.         p = p->pNext;
  70.         len++;
  71.     }
  72.     if(p != pHead->pNext)
  73.         {
  74.             printf("\b.\n");
  75.             printf("节点个数为%d\n",len);
  76.             return len;
  77.         }
  78.     else
  79.         return is_empty(pHead);
  80. }

  81. void sort_list(PNODE pHead, int len)
  82. {
  83.     PNODE p, q;
  84.     int i, j, t;
  85.     for(i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext)
  86.         for(j = i+1, q = p->pNext; j < len; ++j, q = q->pNext)
  87.         {
  88.             if(p->data > q->data)
  89.             {
  90.                 t = p->data;
  91.                 p->data = q->data;
  92.                 q->data = t;
  93.             }
  94.         }
  95.     printf("排序后链表为:\n");
  96.     for(p = pHead->pNext; p != NULL; p = p->pNext)
  97.         printf("%d ",p->data);
  98. }

  99. char is_empty(PNODE pHead)
  100. {
  101.     if(pHead->pNext == NULL)
  102.     {
  103.         printf("链表为空!");
  104.         return 1;
  105.     }
  106.     else
  107.         return 0;
  108. }

  109. int delete_list(PNODE pHead, int len)
  110. {
  111.     int val, n, i;
  112.     PNODE p = pHead->pNext, q = pHead;
  113.     printf("\n请输入要删除的元素及其位置:");
  114.     scanf("%d %d", &val, &n);
  115.     for(i = 1; i != n && i <= len; ++i )
  116.     {
  117.         p->pNext; q->pNext;
  118.     }
  119.         //printf("\n%d, %d, i = %d\n",p->data, q->data, i);
  120.         if(i == n && p->data == val)
  121.         {
  122.             q->pNext = p->pNext;      //p指向当前要删除的结点,q指向他的前驱结点
  123.             free(p);
  124.         }
  125.         else
  126.         {
  127.             printf("输入错误,找不到对应的结点或位置!");
  128.             return 0;
  129.         }
  130.     printf("您已经删除了第%d个结点%d!\n", n, val);
  131.     return 1;
  132. }
复制代码
东西有点长,其实其余的不用看,只看delete_list函数就行。delete_list函数中p, q都是指针,pHead为链表头指针,关键是那个for循环,循环体执行不了,每次都只是i的值变化,p, q就不动。求解!
随风飞翔2424
发表于 2011-8-19 10:56:26 | 显示全部楼层
看不懂代码的路过……
yege0201
发表于 2011-8-19 10:56:28 | 显示全部楼层
第130行那里的循环的内容应该改成p=p->pNext; q=q->pNext吧~否则p,q当然不会走了~

评分

参与人数 1经验 +5 收起 理由
法外制裁者 + 5 感谢解答: )

查看全部评分

Kukon
发表于 2011-8-19 11:03:18 | 显示全部楼层
表示一句都看不懂,路过帮顶。
rzj9999
发表于 2011-8-19 11:07:20 | 显示全部楼层
难道你在分析杀软
blue_仰望
 楼主| 发表于 2011-8-19 11:16:46 | 显示全部楼层
yege0201 发表于 2011-8-19 10:56
第130行那里的循环的内容应该改成p=p->pNext; q=q->pNext吧~否则p,q当然不会走了~

额,非常感谢。我竟然犯了这么低级的错误,唉,找了N久没看出来……

谢谢谢谢谢谢谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]谢谢[:03:]

实在是不能加人气,不然肯定给你加上。
yege0201
发表于 2011-8-19 11:34:34 | 显示全部楼层
lniwn 发表于 2011-8-19 11:16
额,非常感谢。我竟然犯了这么低级的错误,唉,找了N久没看出来……

谢谢谢谢谢谢[ ...

我有时也是自己的程序看N遍都找不出来错误~别人看了一遍就发现了~而且还是低级错误~

互帮互助就好~人气什么的都无所谓了~下次别再犯低级错误了(不过我一直都在犯)~
迷失@天堂
发表于 2011-8-19 11:41:54 | 显示全部楼层
原来这里也可以讨论代码,哎java搞死我了
聪明的小老鼠
发表于 2011-8-19 11:41:54 | 显示全部楼层
delete_list函数好像有个小小的bug

指针p一开始就指向了 pHead -> pNext,那如果链表中只有一个节点时,此时 p 就变成 NULL 了
再次执行 p -> pNext 就会发生内存错误

楼主可以调试一下

PS:此贴发错区吧
。花名未知丶
发表于 2011-8-19 12:10:21 | 显示全部楼层
一句也看不懂
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-5-9 03:56 , Processed in 0.133578 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

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