死线 发表于 2009-9-15 16:43

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

本帖最后由 死线 于 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做這個真累

http://i248.photobucket.com/albums/gg179/ooooo84/b74096b7.jpg

死线 发表于 2009-9-15 16:56

本帖最后由 死线 于 2009-9-15 16:58 编辑

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

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

2.這個是循環建單鏈表的問題,畫個圖就明白了 ...
好人修電腦 发表于 2009-9-15 16:49 http://bbs.saraba1st.com/images/common/back.gif
画个什么类型的图……

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





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

shinzero 发表于 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

lykojo 发表于 2009-9-15 20:04

r=s

r=r->next
一个意思

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

tsvn 发表于 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_ware/data_structure/web/xianxingbiao/xianxingbiao2.3.1.1.htm

sexpistols 发表于 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以为下一步改写做好准备?
页: [1]
查看完整版本: [求智商]C语言编程问题……