找回密码
 立即注册
搜索
查看: 2038|回复: 8

[求智商]C语言编程问题……

[复制链接]
     
发表于 2009-9-15 16:43 | 显示全部楼层 |阅读模式
本帖最后由 死线 于 2009-9-15 16:44 编辑

感觉智商有点不够,自学果然麻烦……

有如下例题,目的是利用结构体建立一个线性链表:

#include <stdio.h>
#include <stdlib.h>
struct slist
{          int data;
        struct slist *next;
};
typedef struct slist SLIST;
SLIST *creat_slistl()
{        int c;
        SLIST *h,*s,*r;
        h=(SLIST *)malloc(sizeof(SLIST));        /*生成头结点*/
        r=h;
        scanf("%d",&c);                /*读入数据*/
        while(c!=-1)        /*未读到数据结束标志时进入循环*/
        {         s=(SLIST *)malloc(sizeof(SLIST));        /*生成一个新结点*/
                s->data=c;        /*读入的数据存入新结点的data域*/
                r->next=s;        /*新结点连接到表尾*/
                r=s;
                scanf("%d",&c);                /*读入数据*/
        }
        r->next='\0';        /*置链表结束标志*/
        return h;        /*返回表头指针*/
}
main ()
{        SLIST *head;
                .
                .
                .
        head=creat_slistl();        /*调用链表建立函数,得到头结点地址*/
                .
                .
                .
}


但是本人有些无法理解的地方:

1、结构体slist并未定义任何结构体变量,仅定义了三个指针,然后申请动态内存分配。这样申请出来的内存区域也会自动呈现“data、*next”结构么?

2、前面已经有了“r->next=s;”,后面再来个“r=s;”两者不构成重复么?区别是什么?

想了半天依然找不到可以解释的办法,求高人指点……
回复

使用道具 举报

发表于 2009-9-15 16:49 | 显示全部楼层
本帖最后由 好人修電腦 于 2009-9-15 16:58 编辑

這個東西找張紙畫個圖就一目了然了

1.struct的確未定義變量,但是它定義了SLIST類型的指針并且申請了內存,所以相當於創建變量

2.這個是循環建單鏈表的問題,畫個圖就明白了,我只弄了三步,應該能明白,Word做這個真累

回复

使用道具 举报

     
 楼主| 发表于 2009-9-15 16:56 | 显示全部楼层
本帖最后由 死线 于 2009-9-15 16:58 编辑
這個東西找張紙畫個圖就一目了然了

1.struct的確未定義變量,但是它定義了SLIST類型的指針并且申請了內存,所以相當於創建變量

2.這個是循環建單鏈表的問題,畫個圖就明白了 ...
好人修電腦 发表于 2009-9-15 16:49

画个什么类型的图……

因为是自学,所以中间可能有些东西漏掉了……





另外,这样申请出来的变量是否该算是结构体的匿名成员?
回复

使用道具 举报

     
发表于 2009-9-15 16:59 | 显示全部楼层
本帖最后由 shinzero 于 2009-9-15 21:00 编辑

r->next=s 将现节点地址存入前一节点,为以后遍历做准备

r=s,r与s都指向现节点,即s,现节点成为新的前一节点
回复

使用道具 举报

发表于 2009-9-15 17:01 | 显示全部楼层
結構體的成員是data和next

這樣建出來的結構體“變量”是個沒有變量名,只有指向其指針的東西,類型是slist
回复

使用道具 举报

     
发表于 2009-9-15 20:04 | 显示全部楼层
r=s

r=r->next
一个意思

可以理解成r指针在做遍历。
回复

使用道具 举报

发表于 2009-9-15 21:23 | 显示全部楼层
大家明白声明一个自注释的变量名的重要性了么...

2: 对于单链表的一个结点来说 data 用来保存数据值,next是一个结点指针,指向下一个结点 这样才能够成一个单链表

前面已经有了“r->next=s;”,后面再来个“r=s;”两者不构成重复么?区别是什么?
r->next=s 此时的r是链表尾结点指针,新加了一个结点s,所以放在链表尾结点的next指针中
r=s;这个是将结点指针s赋值给r,这样r又变成了链表的尾结点;
简单点来说就是结点指针r一直是链表尾结点,新增的结点指针s放在了链表尾,需要把r指向s,重新变成链表尾;

http://student.zjzk.cn/course_wa ... xingbiao2.3.1.1.htm
回复

使用道具 举报

发表于 2009-9-15 23:11 | 显示全部楼层
如果链表的原理你确实弄懂了的话,
把c, h, s, r分别换成data, head, current, last, 会发现其实这段很好懂int data;
SLIST *head, *current, *last;
head = (SLIST*)malloc(sizeof(SLIST));
last = head;
scanf(\\&quot;%d\\&quot;, &amp;data);

while (data != -1)
{
    current = (SLIST*)malloc(sizeof(SLIST));
    current-&gt;data = data;
    last-&gt;next = current;  
    last = current;        
    scanf(\\&quot;%d\\&quot;, &amp;data);
}

last-&gt;next = 0;
return head;
回复

使用道具 举报

     
 楼主| 发表于 2009-9-17 16:57 | 显示全部楼层
是不是应该这样解释?

无论是S还是R都是指向结构体变量整体的指针,因此要向DATA或者NEXT这样的类型区写入内容必须用“变量名.类型名”的方式加以细分指向。但因为这里全部都是匿名变量,因此只能用“S(或R)->类型名”的方式对其当前指向的区域类型区进行访问。

因此“S->DATA”不等于“S”(R同理)。正如S->DATA=C不会将S的值由地址改变成数值一样,“R->NEXT”仅仅是改写了R当前所指向变量的NEXT区域的内容,R自身的值还是没有变,因此必须另行将S的值赋给R以为下一步改写做好准备?
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-9-19 13:33 , Processed in 0.090622 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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