| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 546 人关注过本帖
标题:有关链表建立的问题
只看楼主 加入收藏
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:6 
有关链表建立的问题
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct node *link;
struct node {
    char item;
    link next;
    };
link NODE(char item,link next)
{
    link t = (link)malloc(sizeof *t);
    t->item = item;
    t->next = next;
    return t;
}
int main()
{
    int i;link t,head = NULL;
    srand(time(NULL));
    for (i=0;i<10;i++)
    {
        head = NODE(rand()%100,head);  //head = 新空间?
    }
    for (t=head;t;t=t->next)
    {
        printf("%3d",t->item);
    }
}


 head = NODE(rand()%100,head); 这一句我感到很困惑,既然后调用了NODE()那么应当在函数调用完之后,系统不会收回已经分配的空间么?烦请请大家分析一下这个函数调用的过程,说明下这个链表建立的过程,跪拜了~~~

搜索更多相关主题的帖子: 链表 
2010-08-01 10:19
pbreak
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:83
专家分:558
注 册:2007-5-10
收藏
得分:7 
用malloc开辟的空间要手动回收的。
2010-08-01 11:08
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
收藏
得分:13 

回答如下:
  1)rand()%100,产生一个[0,99]之间的随机数。这个数作为实际参数传递给NODE的形参char item。
  2)malloc函数申请到的是”堆“区的空间,”堆“区的内存空间是需要程序员手动申请和释放的一块空间。从而,你的程序缺少释放空间的相应代码。
  3)至于程序执行的详细分析,在这里写出来不太方便。建议你去网上找找《C语言与程序设计大学教程一书》,里面有很详细的关于链表建立时,内存的变化示意图。
2010-08-01 11:28
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
收藏
得分:0 
感谢两位的回答。
请问在定义head指针与t指针的时候,编译器为他们分配了空间么?
还有就是这段代码是不是一个从后到前建立链表,打印的时候又是从前到后的呢?
2010-08-01 11:34
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
收藏
得分:0 
楼主有以下迷糊的地方:
1)没有分清“堆”与“栈”的区别。
2)没有分清链表的“前插入”与“后插入”的区别。

head与t是个指针变量,它们的存储空间在“栈”区,栈区的存储空间不用程序员自己释放。
head与t所指向的空间存在于“堆”区,它们所指向的空间是需要程序员自己申请和释放的!

从你的程序来看,你每次都在链表头上插入新结点。因此,你打印出来的顺序正好与你建立时的顺序相反。
2010-08-01 11:38
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
收藏
得分:0 
以下是引用BJ_BOY在2010-8-1 11:38:50的发言:

楼主有以下迷糊的地方:
1)没有分清“堆”与“栈”的区别。
2)没有分清链表的“前插入”与“后插入”的区别。

head与t是个指针变量,它们的存储空间在“栈”区,栈区的存储空间不用程序员自己释放。
head与t所指向的空间存在于“堆”区,它们所指向的空间是需要程序员自己申请和释放的!

从你的程序来看,你每次都在链表头上插入新结点。因此,你打印出来的顺序正好与你建立时的顺序相反。
每次都在链表头上插入新结点?
这句话怎么理解,我看代码的意思是head指向返回的指针[也就是t每次销毁前所指向的],而之前堆中开出来的空间一直存在。
不知道您理解的是?
还有,这个方法貌似只要用到一个全局指针,不属于前插入或者后插入?
2010-08-01 14:05
jbddd
Rank: 2
等 级:论坛游民
帖 子:45
专家分:24
注 册:2009-7-26
收藏
得分:0 
还请大家多多的指导谢谢了
2010-08-04 00:27
快速回复:有关链表建立的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045411 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved