[求智商]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:58 编辑
這個東西找張紙畫個圖就一目了然了
1.struct的確未定義變量,但是它定義了SLIST類型的指針并且申請了內存,所以相當於創建變量
2.這個是循環建單鏈表的問題,畫個圖就明白了,我只弄了三步,應該能明白,Word做這個真累
http://i248.photobucket.com/albums/gg179/ooooo84/b74096b7.jpg 本帖最后由 死线 于 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 21:00 编辑
r->next=s 将现节点地址存入前一节点,为以后遍历做准备
r=s,r与s都指向现节点,即s,现节点成为新的前一节点 結構體的成員是data和next
這樣建出來的結構體“變量”是個沒有變量名,只有指向其指針的東西,類型是slist r=s
和
r=r->next
一个意思
可以理解成r指针在做遍历。 大家明白声明一个自注释的变量名的重要性了么...
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 如果链表的原理你确实弄懂了的话,
把c, h, s, r分别换成data, head, current, last, 会发现其实这段很好懂int data;
SLIST *head, *current, *last;
head = (SLIST*)malloc(sizeof(SLIST));
last = head;
scanf(\\"%d\\", &data);
while (data != -1)
{
current = (SLIST*)malloc(sizeof(SLIST));
current->data = data;
last->next = current;
last = current;
scanf(\\"%d\\", &data);
}
last->next = 0;
return head; 是不是应该这样解释?
无论是S还是R都是指向结构体变量整体的指针,因此要向DATA或者NEXT这样的类型区写入内容必须用“变量名.类型名”的方式加以细分指向。但因为这里全部都是匿名变量,因此只能用“S(或R)->类型名”的方式对其当前指向的区域类型区进行访问。
因此“S->DATA”不等于“S”(R同理)。正如S->DATA=C不会将S的值由地址改变成数值一样,“R->NEXT”仅仅是改写了R当前所指向变量的NEXT区域的内容,R自身的值还是没有变,因此必须另行将S的值赋给R以为下一步改写做好准备?
页:
[1]