免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1551 | 回复: 8
打印 上一主题 下一主题

问一个数据结构的链表表的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-03 22:14 |只看该作者 |倒序浏览
实现了一个删除的方法,代码如下:


  1. llink delnode(llink head,int pos)
  2. {
  3.    llink ptr;
  4.    int n = 1;
  5.    while (head != NULL )
  6.    {
  7.       if (pos == 1)
  8.       {
  9.         ptr = head;
  10.         head = head->next;

  11.         printf("[%d][%d]\n",ptr,head->num);
  12.         free(ptr);
  13.         return head;   
  14.       }
  15.       if (n == pos - 1){
  16.         ptr = head->next;
  17.         head->next = ptr->next;
  18.         free(ptr);
  19.         return head;
  20.       }
  21.       head  = head->next;
  22.       n++;
  23.    }
  24. }
复制代码


当如下调用的时候:
   delnode(head, 2);
   printf("\n删除后的: ");
printllist(head);
输出:[1][3][4][5][6]
但如果这样调用:
   delnode(head, 1);
   printf("\n删除后的: ");
printllist(head);
输出:[0][[2]3][4][5][6]
但期望的确是:[2]3][4][5][6]
请大家帮我找下原因,该如何修改。

  1. struct llist                       /* 串列结构宣告      */
  2. {
  3.    int num;                       /* 邮寄编号          */
  4.    struct llist *next;             /* 指向下一标签      */
  5. };
  6. typedef struct llist node;         /* 定义新型态        */
  7. typedef node *llink;               /* 定义新型态指标    */
  8. llink createllist(int *array,int len)
  9. {
  10.    llink head;                     /* 串列的开始指标    */
  11.    llink ptr,ptr1;
  12.    int i;

  13.    /* 建立第一个节点 */
  14.    head = ( llink ) malloc(sizeof(node)); /* 配置记忆体 */
  15.    if ( !head )                   /* 检查指标          */
  16.       return NULL;
  17.    head->num = array[0];          /* 建立节点内容      */
  18.    head->next = NULL;             /* 设定指标初值      */
  19.    ptr = head;                    /* 将ptr指向串列开始 */
  20.    for ( i = 1; i < len; i++ )    /* 建立其它节点回路  */
  21.    {
  22.        ptr1 = ( llink ) malloc(sizeof(node));
  23.        if ( !ptr1 )
  24.           return NULL;
  25.        ptr1->num = array[i];      /* 建立节点内容      */
  26.        ptr1->next = NULL;         /* 设定指标初值      */
  27.        ptr->next = ptr1;          /* 连结节点          */
  28.        ptr = ptr->next;           /* 指向下一节点      */
  29.    }
  30.    return head;
  31. }
复制代码

完整代码附件!

list.rar

1.44 KB, 下载次数: 33

完整代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-09-03 22:28 |只看该作者
delnode(head, 2);
你的这个函数返回链表的头结点,
但是你并没有使用它去修改你的head变量。
所以head还是原来的值。

论坛徽章:
0
3 [报告]
发表于 2006-09-04 01:06 |只看该作者
head=delnode(head, 2);   要重新返回头指针给head

论坛徽章:
0
4 [报告]
发表于 2006-09-04 11:10 |只看该作者
楼上正解,

把 delnode(head,2) 写成head=delnode(head,2);就OK了,

另外,我看了一下你的全程序,感觉还是不错的,但是在MAIN函数中,还有其它几处例如:printlist(head)这个函数如果你不把head返回的话,它始终是以未删除前的head来打印链表,当然会出现问题了。
insertnode(head,ptr,value)这个函数体中,有一个变量:new ,建议你把它换一下,这不是一个好的编程风格,因为new是个关键字。。

论坛徽章:
0
5 [报告]
发表于 2006-09-04 15:43 |只看该作者
不能修改地址,只能修改指针的值,所以可以修改结构体里面的元素。
因此在你的delnode函数里面,你可以修改head结构体里面的next元素,所以只有当修改第一个node的值的时候会出现问题,其他都可以。

另外我觉得freelist也是不行的,内存还是在那里。

论坛徽章:
0
6 [报告]
发表于 2006-09-04 21:45 |只看该作者

那我可以从另外一个角度来理解

因为我是JAVA转过来的。
在JAVA中不存在指针,只有引用和传值。
如果非要
head =  delnode(head, 1);
这样写那说明这个delnode(llink head,int pos)就是一个传值,非要返回值赋值后才能改变链表。
我不知道对不对,大家告诉我一下。

另外:风云使者说:我觉得freelist也是不行的,内存还是在那里。
那帮我写一个合适的freelist方法,我参考学习下!多谢!

论坛徽章:
0
7 [报告]
发表于 2006-09-05 09:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2006-09-05 22:07 |只看该作者

多谢

回答楼上的:是的多谢指出,是不应该放在循环里面。

论坛徽章:
0
9 [报告]
发表于 2006-09-05 22:26 |只看该作者

我终于明白指针了。

这个函数说明C语言中的函数都是传值的,只能通过修改指针里面对应的值,来改变函数外的值,但指针本身是不改变的。这就是为什么那个函数需要head = head->next;在函数外赋值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP