| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 920 人关注过本帖
标题:请教大家关于链表插入问题?
只看楼主 加入收藏
清微御宇
Rank: 6Rank: 6
来 自:开封
等 级:侠之大者
威 望:2
帖 子:318
专家分:497
注 册:2012-1-15
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:16 
请教大家关于链表插入问题?
想弄个学生信息录取程序(包括                 打印),各部分有函数实现后共main调用,
struct students

int mum;
char name[20];
…………
…………
struct student  *next;


create()//建表!
return (head);
但插入数据时遇到了些问题
add()//插入后打印木有,我直接用head传过来的值,对head->next操作插入的,结束打印出来还是原来建表的数据,是否要对head->next地址操作,在调用结束后才能插入数据?或是用其它什么方法来实现!
搜索更多相关主题的帖子: head next return create 
2012-05-27 23:34
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:6 
弄清楚是传回来的是值 还是地址。

用心做一件事情就这么简单
2012-05-28 00:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:6 
你搞清链表的原理没有?

授人以渔,不授人以鱼。
2012-05-28 01:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

不管你怎么创建链表,都要记住上面的原理。项放在什么位置,首先数据实体必须存在于内存中,有确切的地址,然后修改相关指针把链表搭接正确。链表的作用,只是胜在不用挪动数据实体(当数据体相当庞大或复杂的时候是很难挪动它的),通过编辑指针指向改变数据序列的排列顺序,不管数据实体的地址是不是连续的,都可以轻易调整进行操作。但要知道,优势的同时必然也是劣势,就是获得前述方便性的同时,增加你编码的复杂度,你必须时刻知道自己在做什么、为了什么、怎么才能做得到。搞清楚这个原理,如何编码和调试,都有思路了,否则你茫然乱试,永远也找不到门路。

看着上面的图,追加、插入、删除、交换等等操作,都知道怎么做。这都是固定的套路,不管数据体是什么类型,抽象的算法路子是完全一样的,平时的编码练习,就是把这种固定的抽象套路实现出一个可重复调用的模板,以后套数据就行了,不是每一个链表都要写一次那些算法编码的。如果有人每写一个链表,都要把算法重复一遍,那只能表明他没有学好编程。这也是人家标准库提供链表库代码的根本原因。

[ 本帖最后由 TonyDeng 于 2012-5-28 01:46 编辑 ]

授人以渔,不授人以鱼。
2012-05-28 01:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
链表插入快速,是指这么一种方式:先创建新项数据,它有地址之后,确定它插入在哪两项之间,然后把两项的链指针解开,按上图那种构造分别接驳到新项上,这样就形成新的链条。这种操作,不用像线性序列那样挪动前后数据串,效率就高了。

链表在这方面有优势,劣势也因这种结构而来:要查找链条上的数据,就必须沿着链条逐个检索,无法跳跃,而这正是线性表的优势所在。因此,链表的搜索效率是比线性表要低的,如果储存在外部文件,由于按顺序存放,于是链表就变成了线性表,这个时候,又能使用线性表的优势了。其实,在内存中,即使使用线性表,当要挪移的数据量不是非常大的时候,线性表的插入效率并不比链表低,但编码复杂性却低得多。通常,链表的效率在数据量到数千项时才体现出来,而且这还是以实际搬动数据的量来算,如果插入位置靠后,要挪移的数据其实很少,效率仍然是高的。具体应用采用什么数据结构,要看实际情形,不能一概而论的。有些人很著迷于链表,连建个菜单都要用链表,不过就是二三十项数据,用的着链表么。

[ 本帖最后由 TonyDeng 于 2012-5-28 02:21 编辑 ]

授人以渔,不授人以鱼。
2012-05-28 02:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你要在链表中插入一项,传链头没什么作用,需要的是新项跟在谁的后面,跟在谁后面,就传谁的地址,然后把新项驳在它后面;如果新项不是最后一项,就要连带把原先的后项驳到这个新项之后。这样操作完,就完事了,不需要链头。但是关键的问题是在这里:新项数据实体的内存分配要确保不要在函数操作之后自动废除,并且创建的指针要能确实找得到这个数据实体!

授人以渔,不授人以鱼。
2012-05-28 02:15
清微御宇
Rank: 6Rank: 6
来 自:开封
等 级:侠之大者
威 望:2
帖 子:318
专家分:497
注 册:2012-1-15
收藏
得分:0 
回复 6楼 TonyDeng
新项数据实体的内存分配要确保不要在函数操作之后自动废除,并且创建的指针要能确实找得到这个数据实体!
就是这个函数操作之后自动废除,打应出来还是以前的数据?我在想想吧!

Stay hungry , Stay foolish!
2012-05-28 13:55
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:6 
多半是你对指针理解有点问题,链表的结束条件就是最后一个元素的Next指针指向NULL。
head         元素1        元素2
[data|next] [data|next] [data|next]      NULL
       |-----------↑                     
                    |-----------↑        
                                |---------↑
玩下字符画。

我们都在路上。。。。。
2012-05-29 11:34
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:6 
point0 :<head|*link0>  link0==p1;
point1 :<p1|*link1>    link1==p2;
point2 :<p2|*link2>     link2==NULL;
插入pointX(point0与point1之间);
分配内存给pointX <pointX|*linkX>;
令link0=pointX;
再令*linkX=p1;

像你的问题,可能在插入位置的前一个元素的link(即next),没有给他重新赋值,还保存原来的值,那样输出时,新插入的元素(point)就会被绕开,不经过它。

2012-05-29 14:04
清微御宇
Rank: 6Rank: 6
来 自:开封
等 级:侠之大者
威 望:2
帖 子:318
专家分:497
注 册:2012-1-15
收藏
得分:0 
呵呵,中午都弄差不多了,晚上发上来大家多多指点哈!!!

Stay hungry , Stay foolish!
2012-05-29 16:00
快速回复:请教大家关于链表插入问题?
数据加载中...
 
   



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

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