关于链表 看过数据结构书了 都市小说怎么写写都不对

数据结构实验指导书(单链表验证二叉树图的存储) - 下载频道
- CSDN.NET
&&&&数据结构实验指导书(单链表验证二叉树图的存储)
数据结构实验指导书(单链表验证二叉树图的存储)
数据结构是一门实践性很强的课程,只靠读书和做习题是不能提高实践能力的,尤其是在数据结构中要解决的问题更接近于实际。数据结构的实验是对学生的一种全面的综合训练,与程序设计语言课程中的实验不同,数据结构课程中的实验多属创造性的活动,需要学生自己分析问题,设计数据结构和算法,再上机调试和测试程序。数据结构实验是一种自主性很强的学习过程,其教学目的主要有两个:(1)深化理解和掌握书本上的理论知识,将书本上的知识变“活”;(2)理论和实践相结合,使学生学会如何把书本上有关数据结构和算法的知识用于解决实际问题,培养数据结构的应用能力和软件工程所需要的实践能力。
为了达到上述目的,本书安排了如下三类实验:
(1)验证实验:其主要内容是将书上的重要数据结构上机实现,深化理解和掌握理论知识,这部分的实验不需要学生自己设计,只须将给定的方案实现即可;
(2)设计实验:其主要内容是针对具体问题,应用某一个知识点,自己设计方案,并上机实现,目的是培养学生对数据结构的简单应用能力;
(3)综合实验:其主要内容是针对具体问题,应用某几个知识点,自己设计方案,并上机实现,目的是培养学生对数据结构的综合应用能力。
在验证实验中,由实验目的、实验内容、实现提示和实验程序等4部分组成,其中实验目的明确了该实验要学生掌握哪些知识点;实验内容规定了实验的具体任务;实现提示给出了数据结构和算法的设计方法;实验程序给出了实验的范例程序,并且在主教材的随书光盘中有该实验涉及到的数据结构的全部实现。在验证实验中,不要求但鼓励学生在完成实验任务的基础上,对该实验涉及的数据结构的其他实现方法进行探索。
在设计实验和综合实验中,由问题描述、基本要求、设计思想、思考题等4部分组成,其中问题描述是为学生建立问题的背景环境,指明“问题是什么”;基本要求是对问题的实现进行基本规范,保证预定的训练意图,使某些难点和重点不会被绕过去,而且也便于教学检查;设计思想给出了设计数据结构和算法的主要思路;思考题引导学生在做完实验后进行总结和扩充。
虽然在设计实验和综合实验中都给出了一定的设计方案,但是,学生不应拘泥于这些分析和设计,要尽量发挥想象力和创造力。对于一个实际问题,每个人可能会有不同的解决办法,本书给出的范例方案,只是希望把学生的思路引人正轨,提出了思考问题的方法,但是不希望限制学生的思维,鼓励学生自己设计解决方案。
若举报审核通过,可奖励20下载分
被举报人:
zhaiwen140
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行初学数据结构,请问一个单链表的有关问题
&来源:读书人网&【读书人网():综合教育门户网站】
初学数据结构,请教一个单链表的问题一直无法静下心来学习数据结构,总是觉得太难呵呵,今晚,决定认真地学习
初学数据结构,请教一个单链表的问题一直无法静下心来学习数据结构,总是觉得太难呵呵,今晚,决定认真地学习他,学好他,就看了链表,就难住了。我看到它初始化链表的函数是这样写的:C/C++ codevoid InitList(struct sNode **HL){
*HL=NULL;}我看到形参就愣了,初始化链表,不就是将表头指针置为空指针吗?为什么要用二级指针,直接将表头指针置空不就行了吗?如:C/C++ codevoid InitList(struct sNode *HL){
HL=NULL;}这就是我的疑问。但我想,他这样写,应该是有他的意思,应该不会是作者的错或者打印的错,那么,就只能是我错了,那又是为什么呢?为什么要用二级指针?接下来是重点了,是我自己对这个问题的想法,但身边没什么人可问,也不敢肯定,所以就来发贴了,我是这样想的:我们都知道,C语言的函数调用有传值和传址之分,将一个常规变量的地址传递给一个相应类型的指针形参,那么,就可以改变这个变量的值,而直接将这个变量传过去,却是不行,因为传值的思想是“将变量复制多一份”,那么,对于指向结构体的指针,是不是也一样呢?我们虽然传的是指针,但实际上,传的是这支针所指向的结构体的未知地址(因为还没初始化,定义的时候系统随机分配空间,所以说不知这支针指向何处,用未知地址来表达不知可不可以),所以我们在初始化函数中修改到的并不是这支针,而是这支针所指向的结构体,所以,要达到初始化的目的,我们要传的,是这支针的地址,才能达到修改这支针的目的。我是这样想,自己感觉好像也说得过去,但就是不敢肯定,请各位大虾解答解答。[解决办法]用二级指针,只是因为在初始化时要为这个单链表建立一个专门的头指针,而与参数传递没有直接的关系。一般是这样写代码的吧?C/C++ codevoid InitList(struct sNode *HL){
HL=(struct sNode *)malloc(sizeof(struct sNode));
HL-&next = NULL;}[解决办法]建议楼主看看这个,月经贴了http://topic.csdn.net/u//3ce14f1c-f0ff-4290-b1dc-d175a51667e9.html[解决办法]一级指针是带不回去的,lz那样做没有修改实参的值要达到目的,要么用二级指针,或者用指引的引用[解决办法]你在调用InitList里对链表定义估计是struct sNode *p;
/*此时p是指向一个节点(struct sNode )类型的指针*/
InitList(p);
/*如果用InitList(struct sNode *HL)的形式,那么是相同类型的变量,会出现变量拷贝,也就是HL也指向p指向的那个节点,InitList()内部执行了HL=NULL;是不会影响P指针的*//*如果用InitList(struct sNode **HL)的形式,那么不用变量拷贝,也就是*HL指向p,InitList()内部执行了**HL=NULL;则会改变P指针的指向,达到改变指向内容的目的*/C/C++ codevoid InitList(struct sNode **HL){
**HL=NULL; /*我认为第一个初始化应该有两个星号*/}[解决办法]一级指针是带不回去的,lz那样做没有修改实参的值要达到目的,要么用二级指针,或者用指引的引用[解决办法]看不懂呢,唉,也得学习了[解决办法]case1:void InitList(struct sNode **HL){
*HL=NULL;}case2:void InitList(struct sNode *HL){
HL=NULL;}不要把指针过分地特殊化,其实 struct sNode* HL;中HL是一个指针变量。当调用函数,传递指针变量的时候,它也跟传递普通变量一样要临时拷贝指针变量。所以case2中函数内部的HL并非调用函数时的实参。所以HL = NULL;不会传递回实参。同样地,case1中二级指针变量HL也是一个临时变量。但是由于HL是一个二级指针,所以*HL是不变的,对*HL赋值可以传回实参。[解决办法]这个函数的作用是初始化链表头,就是要初始化这个HL这个指针.void InitList(struct sNode *HL)这个函数,执行的时候就是初始化了它的指向.21:
HL = NULL;
dword ptr [ebp+8],0void InitList(struct sNode **HL)这个函数,因为传过来的是指向链表头的指针,就等于对链表头赋值.26:
*HL = NULL;
eax,dword ptr [ebp+8]004020BB
dword ptr [eax],0执行时的汇编代码37:
sNode* p = NULL;
dword ptr [ebp-4],0 //dword ptr [ebp-4]地方就是038:39:
InitList(p);004020FF
eax,dword ptr [ebp-4] //eax里面就是0
eax //参数传过去的是0,并不是p的地址
@ILT+730(InitList) (004012df)
InitList(&p);0040210B
ecx,[ebp-4] //得到p的有效地址0040210E
ecx //这里传过去的才是真正p0040210F
@ILT+745(InitList) (004012ee)
esp,4不知道我的理解对不对,仅供参考Java、Python中没有指针,怎么实现链表、图等数据结构?
按投票排序
我只说一下 Java :虽然没有指针,但每个变量,如果不是基本数据类型(int float 等),那么就是一个引用(reference)。引用类似指针,只是不能进行指针运算,比如 p + 1 指向下一个元素之类的。各种语言的链表实现:
Java 没指针 = Java 处处是指针
实现基本的数据结构时指针唯一的作用就是指向,不涉及指针运算(pointer arithmetic)(这也不叫 const pointer),所以 Java / Python 的引用已经足够做到这一点了。就算实现 B-tree 什么的,配个数组也够了。随手写个 Python 的链表节点,Java 的下面有人贴例子了,都是一样的道理。需要class Node(object):
def __init__(self, value, nextnode=None):
self.value = value
self._nextnode = nextnode
def append(self, n):
if not isinstance(n, Node):
n = Node(n)
self._nextnode, n = n, self._nextnode
self._nextnode._nextnode = n
标签都有“算法与数据结构”了,实现数据结构练习而已,又不是研究 Python 内置对象的实现方法……什么 PyObject 的就走远了哈。
指针只是一种实现的方式,就像人没有了脚不是就不能走路了,可以用假腿。至于怎么实现,每一个节点有一个成员变量引用下一个节点就行了。
其实完全不用指针也可以实现这种结构。参见:
这个可以怒答一发,因为刚用java实现了一下链表,这里针对java和链表,python不发表意见首先,楼上的大大们都说了,引用差不多是受限的指针,完全可以实现指针的功能先上节点的代码private class Node&T& {
public Node&T&
public Node(T d,Node&T& n) {data = next =}
java用类来代替了c,c++的结构体来实现节点,next变量就指向了下一个节点,其实作用跟指针一样的然后就是链表类public class LinkList&T& {
private int linkS
private Node&T& H//类似于头指针,如果是双向链表还可以定义尾指针
public LinkList() {......}
public void add(T item) {.....}
然后链表类只需要一个头指针就可以了,具体的实现网上去找好了,知乎毕竟不是贴代码的地方,我都没见过像我这样粘代码的,希望不要被折叠啊。总结一下,发现用java不仅可以实现链表,还有很多好处,其实也是java的一些优点,比如封装性好,可重用,而且更加的安全。
Python和Java的“引用”就是不能运算的指针。其实我更喜欢go语言的理念,没有任何“引用”,所以就避免了混淆的“传引用”概念。所有的值传递都是传值,指针就是指针,但是不能运算。
记得高中学PASCAL的时候,学长教完指针以后就对我们说:“懂了没……好,懂了就用不到了。下面我们来讲模拟链表……”除了不能实现动态内存以外,静态数据结构完全可以实现(模拟)指针的各种特性。模拟指针大概是这样:用一个单调递增的变量ads作为模拟地址值用H数组存储对象的地址每次新建一个对象i就把ads++,H[i]&--ads.然后对象的属性就用以ads为下标的数组a、b、c……元素存储。需要访问的时候就用一个整型变量P作为模拟指针,P&--H[i]a[p],b[p],c[p]……就等价p*.a
方法有很多:用内置数据结构(list, dict, tuple等)的嵌套/组合,它们隐式地包含了指向/嵌套关系,如上面回答中的graph[u][v]={w0,w1..}类的成员变量、嵌套类可能包含了指向/嵌套关系;引用表示指向关系,只不过引用不能像指针一样运算,比如 p + 1 指向下一个元素,所以可能限制颇多。...Leetcode中的例子class TreeNode:
# 类的结构已经包含了指向关系
def __init__(self, x):
self.val = x
self.left = None
self.right = None
l1 = TreeNode(0)
l2 = TreeNode(1)
l3 = TreeNode(2)
# 引用表示指向关系
l1.right = l3
另外推荐一本书 《Data Structures and Algorithms Using Python》(之前的回答有人提到了)
class linkedList:
def __init__(self,value):
self.val=value
self.next=None
Python里直接用dict套dict就可以表示图,graph[u][v]=w,表示从u到v的有向边,边权(或者其他需要标记的信息)为w。如果是无向图,可以限定u&=v,避免浪费。如果u到v有多条边,那就是dict套dict套set,graph[u][v]={w0,w1..}如果要求存留边之间的或者节点之间的顺序关系,就把dict/set改为ordereddict。以上做法相当于hash表示的邻接表,适合稀疏图。稠密图可以考虑用NumPy存储邻接矩阵以减小额外开销。想看成熟的Python库怎样设计处理图的API的话,看。
我觉得是不能。必须使用指针。。。。其他的反倒是些语法糖。先提一个问题,但是不涉及目前题目中所涉及到的python和java。实现链表的最重要的要求并不对指针的支持而是对于赋值的支持和环境模型吧?不过想想赋值这个过程本身还是涉及地址操作。------ 分隔线 --- 下面有点跑题似乎 。。。前面的答主们提出来的code已经很好的解释这个问题了。所以我只是想说说我理解的链表了。。。。其实你需要构建一个链表,本质上只需要可以构建一个数据pair就可以了,然后我们不断的在这个pair上面加尾巴,就是一个链表的初步了。 然后我们再引入一下赋值操作和环境模型, 链表就可以修改插入了。那不是在复杂的数据结构都可以表示了咩?至于实现一个数据pair,我们用lambda 函数那套似乎就可以了。虽然python的lambda函数不大好使哈~有了这三个东西之后,我们就好办多啦, CONS (a (CONS (b (CONS (c ..(CONS (d NIL))))))
然后我想剩下的事情就是各种嵌套局部环境,想搭建一些链表拉,队列啊之类的用这个就没有问题了。不过考虑到最后还是要对链表进行操作的话,本质上还是得有个access来修改存储的数据吧。不过表现形式到不一定是指针。但我想底层还是必须要指针。以上。
其实Java, python完全可以看成在语言层用语法糖隐藏了指针。Java中,假设class A有 属性 int
a, B(class B) b,那A实例化(b在A实例化新开辟而不是通过外部赋值),内存开辟一段包含一个int a和 一个b 的reference地址,b实例化和A一样,然后把地址抛给A中b的reference。其实这个和C/C++中的A中有个B* b差不多。所以链表、图等数据结构在C/C++中的实现转义到Java中也就是改改语法糖的表示。Python中,链表、树等数据结构大致对应Python自带list、tuple、dict。Python这种动态语言用C实现,拿Python的list来讲,用一个struct PyListObject 实现,看看源码指针随处都是。C/C++这样的语言比较接近早期抽象计算机数据的思维方式,指针其实就是我们抽象数据并且这个数据是聚合但是实际内存离散的胶合层产物。后来出的语言通过其他的方式来抽象数据表示,将指针这个概念隐藏了,显得友好了,但是其实他还在那。
建一个节点类,包含类型为节点类的父子表就可以了。
Python 里的实现是这样的:解释器里一个对象用一个PyObject* 结构体的指针表示变量就是名字跟对象指针绑定了,并不是对指针一点操作能力都没有,也不会把指针完全隐蔽掉的。写程序的时候,指针的概念还是在脑袋里的,只是不能做指针运算了,运行到什么地方,虚拟机里内存是怎么变的,指针是怎么被操作的,心里基本上是有数的。Python中几个基本数据结构是C实现的,List(指针数组,里边记了一堆PyObject指针)/Tuple(指针数组,里边一堆PyObject指针)/Dict(哈希表,也是一堆PyObject指针).图什么的用以上几种结构作为基础,就可以实现了。只是不能直接用结构体了,如果是结构体,直接计算偏移量肯定是最快的。PS:图除了指针表示还有其他表示方法啊,比如用一个矩阵表示…,这种时候就可以用NumPy之类的。========补充:list跟tuple实现记错了,已经改正。链表实现参考吐槽我并关评的匿名用户的答案。
以前用纯数组和下标还不是照样可以完成,只不过需要提前预测好问题规模
java python有引用 == const pointer
前面各位的回答已经很到位了,我补充一下:如果想深入了解如何使用python实现常见的数据结构,推荐阅读《Data Structures and Algorithms Using Python》一书,书中有丰富的代码示例,讲解也比较深入浅出。最值得一说的是,python内置的一些数据结构:list, set, dict等等,书中也都给出了代码实现,对于理解这些内置数据结构也有不少帮助。
静态链表 严的数据结构书里有介绍
google binky pointer c版本与java版本计算机考研 数据结构真题及其答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
计算机考研 数据结构真题及其答案
计​算​机​科​学​与​技​术​专​业​考​研​ ​数​据​结​构​真​题​极​其​答​案​。​好​好​复​习​,​加​油​加​油​啊
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢c语言数据结构链表操作 有错误帮看一下_百度知道
c语言数据结构链表操作 有错误帮看一下
\%d\),int x){HG *p;
} }HG* find(HG *h,int n){ HG *s;%d\
scanf(&link=s;printf(&\ break,&x);link,*q;
}HG: eixt!=x&&p)
h=(HG*)malloc(sizeof(HG));nplease input num\
struct node *
printf(&data=0,int x) {HG *p,i),p-&n&}HG* print(HG *h; while(p-&gt,&n);n&
print(h,&i); fdjff&n&eixt);
char ch:&#92!=NULL)
s=(HG*)malloc(sizeof(HG));i&),n,n);i++)
scanf(&);,n);),&x);%d\data);
int j=1;data=x;n&link=h-&
h=insert(h;}
if(j==i&&p;\
printf(&jjfjjfj&HG* creatc(int a[];nplease input n\
for(i=n;data=a[i-1]; }HG* del(HG *h;
int i,x);%d&),&i;
whlie(p-&f&
h=creatc(a;
p=h-&link=s;n&quot,x),n-1);i&gt,int i,*s;i--)
{s=(HG*)malloc(sizeof(HG));输入插入&
swicth(ch)
{link,i-1;
print(h;print(h;
free(q);n&;
void main() {int a[100];;d&quot!\stdio,&quot,int n){HG *p;
h-&now these %n& }HG* insert(HG *h;data,&a[i]);n;;link=p-&);#include &
s-&;%d&quot#include &link,n);
printf(&%d
%d\printf(&quot,n-1);link=NULL;typedef struct node{i&quot,n+1);please&quot.h&quot:
printf(&quot,),*h;for(i=0;
p=h-&i&lt,x;
scanf(&quot,int n) {HG *p!=NULL&&j&
printf(& p=h-&gt,&quot.h&i++)
h-&n;n&quot
j++;e';n!#include &\jjfjjfj&
p=p-&gt,x; p=q-&;nthe node not find,n).h&quot、f; print(h;i--) {
s=(HG*)malloc(sizeof(HG));; h-&gt,i=
case &#39。
scanf(&link=s;
p-& HG *s; p=h-& };
break,int n){ HG *p;}HG* print(HG *h;;i) {
p=p-& while(1) {
printf(&quot,不足的自己在修改下吧;nplease input num \;data),i-1;n&d'
h-& h=(HG*)malloc(sizeof(HG));
scanf(&quot!&%d&i&gt,&i;typedef struct node{%d& for(i=0;\/&#92,*s,n-1);) ; while(p) {
printf(&quot,&i); HG *h; h=creatc(a、i;data=0; if(p)
printf(&quot.h&i&
scanf(&quot,i););); } if(j==i&&p; printf(&data=x;
scanf(&%c&i++)
scanf(&data=a[i-1]; h-&#include &
s-&gt!=NULL)
s=(HG*)malloc(sizeof(HG));;%d\n&please input \}HG* find(HG *h;link=s;; print(h,&a[i]);n&)!=x&&p)
if(ch==10)/ while(p-&%d
%d\,*h;\link,x); p=h-&gt,e=eixt)&stdlib大体改了下:
case &#39,n-1); for(i=n; printf(&);HG* creatc(int a[];
s-&,&x),f=find:printf(&quot,n+1); int i!=NULL&&j& int j=1; p=h-&输入插入&
ch=getchar();\0;n&
h=insert(h;
s-&link=p-&; for(i=1;}void main(){ int a[100],n; fdjff& while(p-&gt,int n){ HG *p;link=h-&}HG* del(HG *h; scanf(&quot,&ch);f&#39、e(d=n& q=p-&gt,n),int n){i&
print(h,n),&x); printf(& else
printf(&输入错误;);
case &#39,&n);%d\ free(q),int x){ HG *p;nnow these % struct node *
find(h;判断是否读入了enter键值;
switch(ch)
case 'link。读入了重新输入,*q,x);;}HG* insert(HG *h;);n:&
} return h,int x){ HG *p;i&#39:
printf(&quot,请从新输入:
printf(& return h!&}HG;):
exit(0); p=h-&
s-&gt,nplease intput d,p-&gt!&link=NULL
其他类似问题
链表的相关知识
您可能关注的推广回答者:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 此致敬礼的格式怎么写 的文章

 

随机推荐