还剩3页未读,继续阅读
文本内容:
各位同学大家好!经过近一个半月的数据结构课程的学习,我们在授课的同时重点培养了数据结构算法实现,虽然我们师生双方都做了很大的努力,距课程的基本要求还有很大的差距今天我将目前我们计算机科学与技术10级二个班同学算法实现过程中的一些问题进行以下总结,希望能够给予大家更快地掌握实战的需求提供帮助
一、上机实践中出现的一些基本问题㈠C语言的基础知识有待加强主要表现在以下二个方面
1.函数体的基本规则C语言规定,一个函数包括两个部分,一是函数的首部,二是函数体〈函数类型名〉〈函数名〉(形参表)一函数的首部声明部分执行部分)在上机实践中,出现了部分同学将声明部分和执行部分交叉书写的情况
2.函数调用与函数定义中变量类型的混淆函数定义时,需要对函数中的形参的类型进行定义;调用函数时,只需将函数的名字及需要传递的变量书写即可部分同学也出现了函数定义与函数调用时,实参也把类型定义加上的情况
3.常量的定义、基本库函数的作用,且最好都写在程序的最上方
4.由#开头的预编译指令后面不加分号,因为该行是预编译指令面非语句;但typedef是语句,一定要用分号作为这条语句的结束㈠部分同学对上机实践的不重视,主要表现在以下三方面
1.C程序设计实践的基础较薄弱,无法完成最简单的C程序链表程序的设计,说明没有充分利用三天的假期来补充自己的不足;
2.有些同学带来一些从网上下载的程序,但并没有完全读懂,使得无法调试出最基本的程序;
3.有些同学根本没有上机调试过任何程序
二、关于表、栈、队列实践的最最基本要求因为表、栈、队列具有很多共性的问题,当我们的教学内容进行到这个阶段的时候,每个同学应该牢牢掌握最最基本的问题是
1.表头的设计
2.表头的初值
3.表的初始化
4.表的建立
5.表的输出如果大家将这五个最最基本的问题的实现真正的掌握了,请相信老师说的话,你一定能会自己完成其它操作的为实现最最基本的功能,大家一定把下面所提到的各关键内容掌握好,以下的叙述希望对大家有所帮助㈠明确类型定义实行表的各种操作前,除对一些所需的常量采用#define进行定义外,为使各函数中调用方便,根据实际情况采用还需要采用typedef明确组织至少三种类型的定义这些类型的定义可使得面对不同问题时,只需对数据域的操作进行适应修改即可
1.数据元素类型的定义⑴表中数据元素数域数据类型的定义若数据域只有一种基本类型如:char、int、long、float、double时,采用typedef〈基本类型名>ElemType;⑵若表中为两个及以上不同基本类型数据构造而成,需采用typede struct[构造类型名]:I具体成员JElemType进行上述定义即可其中[构造类型名]是否给出都可以如果给出了[构造类型名],在该语句的下面再需要定义时,可以采用struct[构造类型名]或ElemType均可
2.结点类型的定义链式存储各结点类型的定义,是在数据域的基础上增加指针域而形成的定义形式,如:typedef struct〈结点类型名〉ElemType data;Struct〈结点类型名〉*指针变量名;}<结点类型名〉;……;
3.表头类型的定义表头是用来判定表否存在、表是否为空以及表的长度等操作的基础,因此表头仅仅是一个指向某一种结构的指针变量是不够的,需要根据实际情况综合分析后进行设计,关于表有关法规的设计,接下来会给大家详细总结㈡表头的设计及赋初值
1.表头可设计为一个能够存放表头信息的变量或指向表头信息的指针变量其中⑴顺序表的表头信息由三部分组成typedef structElemType*clcm;〃保存表中元素存储的首地址的变量int length;//保存表中元素的实际长度的变量int listsize;〃保存表预留空间长度的变量}SqList;⑵链表的表头信息也三部分组成typedef structLink_LLink head,tail;〃保存表头结点和尾结点地址的变量intlen;〃保存链表实际元素个数的变量}LinkList;
2.表头的设计要在主调函数中完成因为一个表除了要完成最最基本的操作,随着知识的增加和你们技能的提高,还能实现其它的操作
3.表头可以直接用一个保存表头信息的变量,也可以设计成一个能够保存表头信息的指针变量⑴当表头设计成一个保存表头信息的变量时,注意以下几点
①引用表头成员时,只能使用成员运算符,即表头变量.成员名;2变量定义的同时就已经为表头开辟了空间;3需要在函数的执行部分对表头赋初始值以顺序表头为例main SqListII;elem*len*listsize*H.elem=NULL;》表头信息赋初始值,这样说明虽然有表头变量,但表还不存在H.len=0;IL listsize=0;⑵当表头采用指向表头信息的指针变量时,注意以下几点
①引用表头成员时只能使用指向运算符,即表头变量名成员名;
②表头定义时,只为指针变量开辟了空间,没有为表头信息的存放开辟空间,你需要通过malloc函数为表头信息开辟空间,并将存储空间的地址赋给指针变量
③通过指针变量为表头信息赋初始值以链表表头为例main LinkList*H;■**headH=LinkListtail*malloc H-head=H-talengthil=NULL;H.length=0;;为表头信息开辟空间H.listsize=0;1表头信息赋初始值,这样说明虽然有表头信息,J但表还不存在㈢表的初始化表的初始化与表头的初始值是两个不同的概念表头的初始值设置的目的是用来判定表是否存在;表的初始化是设计一个空表表的初始化包括开辟表信息存储空间、表头信息获取相应的基本数据等表的初始化也应在主调函数中完成,以利用不同功能函数的调用1,顺序表的初始化顺序表的初始化包括为线性顺序表开辟一个初始化连续的空间,并将该存储空间同赋给表头的base成员,所开辟的空间的大小赋给表头的listsize成员,同时表头的len成员值保持为Oo
2.链表的初始化带头结点的线性链表的初始化包括开辟一个头结点,并将该头结点的地址赋值给表头的head和tail成员该头结点数据域为非表中信息,主要起到用该头结点的链域来判断链表是否为空3链表中MakeNode函数的作用链表基本操作中,我们曾设计了一个MakeNode函数,该函数仅仅是开辟一个空间,并将该空间的地址通过参数的形式返回到主调函数中去很多同学将此函数与建立链表的CreateList搞混淆了这个函数无论是表的初始化、表的建立以及表的插入等操作都会调用,所以一定将其功能及作用分清楚4关于ADT定义中引用在C程序实现中出现的问题在ADT基本操作中,如需对主调函数中所使用的数据进行修改时,在ADT基本操作定义的形参表中使用了进行说明,所以在主调函数调用含有这样的基本操作时,应将需改变的变量地址传递至该形参变量,在大家上机调试中出现了下面三种错误情况
1.在函数定义时,使用了〈函数类型〉函数名形参类型形参变量};这样的形式上面这种定义形式的错误是一个C语言的基本概念问题,大家只要想到,变量在定义时除了变量名以外,只有在变量前加”表示指针变量,没有其它形式时,就不会发生这种错误了
2.如果在主调函数中所提供的实参是一个指针变量,那么在形参中只需要采用与语调函数的实参类型一致就可以了,因为形参得到的是一个地址,是可以直接对主调函数的空间进行操作的
3.如果在主调函数中所提供的实参是一个变量的地址即变量名,则在形参变量的类型应为实参的指针变量我相信,只要大家将我上面提到的各点注意后,将最基本的五个部分独立完成并全部掌握后,一定会将其它功能函数全部独立实现的。