一直不是很明白链表为何要这样构造

蓝鹰 2011-10-19 07:18:17


typedef struct clist
{
int a;
clist *next;
}Clist;
void initiate(Clist **list)
{
if((*list=(Clist *)malloc(sizeof(Clist)))==NULL)exit(1);
(*list)->next=NULL;
}

为何要在链表的的初始化函数的形参中使用指向指针的指针,这样做有什么好处吗?个人非常不习惯此类用法。
...全文
283 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
adfaksdf 2013-09-24
  • 打赏
  • 举报
回复
引用 3 楼 relaxisland 的回复:
[Quote=引用楼主 blackeaglex 的回复:] C/C++ code typedef struct clist { int a; clist *next; }Clist; void initiate(Clist **list) { if((*list=(Clist *)malloc(sizeof(Clist)))==NULL)exit(1); (*list)->next=NULL; } 为何要在链表…… [/Quote] 如果你要从参数中返回新分配的地址,必须这样写啊。 你要改变实参的值,必须指针传递 你这边要修改的是CList*的值, 因此,必须传递CList**
正解,不过为了方便起见,我一般都返回指针,嚯哈哈哈哈。
赵4老师 2011-10-24
  • 打赏
  • 举报
回复
为什么要有数据结构这个东东?
因为要将现实世界或者抽象理论中的各种数据保存在计算机外存(光盘、硬盘、U盘……)或内存(ROM、RAM、SRAM……)里面的一维二进制字节数组中。
然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。
蓝鹰 2011-10-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 pqpqr 的回复:]

定义的Clist *p系统默认分配的地址是0xcccccccc,是不能使用的。
引用 17 楼 blackeaglex 的回复:
我不知道使用malloc 和不使用malloc 有什么区别,如果定义一个 Clist *p难道不是已经向系统申请内存了吗?为什么还要malloc ,同样,在初始化中也一样。
[/Quote]
也就是说,在这里,每定义一个指针,都要用malloc对其进行初始化才行? 如果说这样初始化是无效的:Clist a; *p=&a?
蓝鹰 2011-10-22
  • 打赏
  • 举报
回复
上面才是我写的
蓝鹰 2011-10-22
  • 打赏
  • 举报
回复
void insert(Clist **list,int x)
{
Clist *p,a;
p=*list;
while(p->next!=NULL)
{
p=p->next;
}
p->a=x;
a.a=x;
a.next=NULL;
p->next=&a; //插入
}
失宠枫 2011-10-22
  • 打赏
  • 举报
回复
合理就好了,写法很随意啦
xjdreamer 2011-10-22
  • 打赏
  • 举报
回复
没有开空间,满了怎么办,最晚有时候能运行,但早晚要出错的

[Quote=引用 16 楼 blackeaglex 的回复:]

追加30分,再问和上面相关的一个问题:下面是我自己写的相应的插入函数:
C/C++ code

void insert(Clist **list,int x)
{
Clist *p;
p=*list;
while(p->next!=NULL)
{
p=p->next;
}
p->a=x;
(*list)->next=p;……
[/Quote]
蓝鹰 2011-10-22
  • 打赏
  • 举报
回复
很抱歉,上面我写的插入函数完全弄错了
蓝鹰 2011-10-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dock_wang 的回复:]

你的代码里面那个j去哪里了?而且你测试你的成功插入是不是只测了p指向的结点??
Clist *p当然没有分配内存,只是分配了一个指针而已
[/Quote]是的,我已经测试了,第一次插入能成功,因为节点就在头节点之后,第二次插入就不行了
ddownload 2011-10-21
  • 打赏
  • 举报
回复
C语言是值传递,懂?
  • 打赏
  • 举报
回复
定义的Clist *p系统默认分配的地址是0xcccccccc,是不能使用的。
[Quote=引用 17 楼 blackeaglex 的回复:]
我不知道使用malloc 和不使用malloc 有什么区别,如果定义一个 Clist *p难道不是已经向系统申请内存了吗?为什么还要malloc ,同样,在初始化中也一样。
[/Quote]
王健龙 2011-10-21
  • 打赏
  • 举报
回复
你的代码里面那个j去哪里了?而且你测试你的成功插入是不是只测了p指向的结点??
Clist *p当然没有分配内存,只是分配了一个指针而已
蓝鹰 2011-10-21
  • 打赏
  • 举报
回复
我不知道使用malloc 和不使用malloc 有什么区别,如果定义一个 Clist *p难道不是已经向系统申请内存了吗?为什么还要malloc ,同样,在初始化中也一样。
蓝鹰 2011-10-21
  • 打赏
  • 举报
回复
追加30分,再问和上面相关的一个问题:下面是我自己写的相应的插入函数:

void insert(Clist **list,int x)
{
Clist *p;
p=*list;
while(p->next!=NULL)
{
p=p->next;
}
p->a=x;
(*list)->next=p; //插入
}


这是书上的代码:

listInsert(Clist *head,int i,datatype x)
{
Clist *p,*q;
int j;
p=head;
j=-1;
while(p->next!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("插入位置出错");
return 0;
}
if((q=(Clist *)malloc(sizeof(Clist)))==NULL)exit(1);
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}


请注意,在我的插入函数里,根本没有用malloc 后来在测试中,居然能够成功插入。
蓝鹰 2011-10-21
  • 打赏
  • 举报
回复
谢谢大家的指导
星爷是我哥 2011-10-21
  • 打赏
  • 举报
回复
没建空间。插入的数据放那里??
hondely 2011-10-21
  • 打赏
  • 举报
回复
条条大路通罗马,程序是死的,人是活的
lovestefanie 2011-10-20
  • 打赏
  • 举报
回复
不习惯的话就return一个指针回去吧
因为c没有引用传值,都是值传值
如果参数只是一级指针的话,起不到改变数据的目的
赵4老师 2011-10-20
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
haofang666777 2011-10-20
  • 打赏
  • 举报
回复
学习了
加载更多回复(11)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧