1、(2)链表整个丢失(3)会发生泄漏(4)顺序查找7.1.8 对链栈,链的生成必须是向 (1) 生成,最新压栈的元素(结点),放在 (2) 位置,弹出时从 (3) 删除结点。对链队,采用向 (4) 生成,新入队的结点放在链的 (5) ,出队操作在 (6) 位置。(1)向前(2)链表头的位置(3)链表头(4)向后(5)尾部(6)链表头7.1.9 在计算机中进行表达式的计算,为解决优先级和运算的结合性,必须使用 (1) 和 (2) 。在中缀表达式中,每个双目运算符放在 (3) 。(1)数栈(2)运算符栈(3)它的两个运算符之间7.1.10 为了能重复利用一个队空间,要求把队说明成一个逻辑上的 (1)
2、 。(1)循环队列7.1.11 二叉树的特点是:(1)每个结点最多有两个孩子(2)子树有左右之分7.1.12 二叉树的遍历是按 (1) 分类,所谓中序遍历是 (2) 。(1)访问子树根节点次序(2)先遍历该子树根结点的左子树回来后,接着再访问根结点,最后遍历右子树7.1.13 二叉排序树又称 (1) 或 (2) 。其左子树上的所有结点均小于根结点的数据值,而右子树上的所有结点均大于根结点的数据值时,采用 (3) 就可以得到一个 (4) 。(1)二叉搜索树(2)树表(3)中序遍历(4)升序序列7.2 简答题7.2.1 new运算符为一个变量或对象分配存储空间和为一个数组分配存储空间,使用方法上有
3、什么不同?对应的delete运算符使用有什么不同?答:为一个变量或对象分配存储空间其使用的格式如下:指针变量名=new 类型名(初始化式);对于数组进行动态分配和撤销的格式为:指针变量名=new 类型名下标表达式;后者多一个下标表达式,同时不能进行初始化。对应的delete运算符使用分别为:delete 指针名;delete 指向该数组的指针变量名;后者多一个方括号,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。delete 的方括号中不需要填数组元素数,系
4、统自知。即使写了,编译器也忽略。7.2.2 用delete删除p所指向的无名对象时,p指针也同时被删除了,对不对?为什么?不对。注意这时释放了p所指向的无名对象占用的内存空间,也就是撤销了该无名对象,称动态内存释放(dynamic memory deallocation),但指针p本身并没有撤销,它仍然存在,该指针所占内存空间并未释放。7.2.3 为什么动态建立类对象数组时,类的定义一定要有缺省的构造函数?new后面类(class)类型也可以有参数。这些参数即构造函数的参数。但对创建数组,没有参数,只能调用缺省的构造函数。7.2.4 要实现深拷贝,自定义的拷贝构造函数应该怎样设计?如果类中有一
5、个数据成员为指针,该类的一个对象中的这个指针p,指向了动态分配的一个堆对象。深拷贝时要给新建立的对象独立分配一个堆对象。这时拷贝的构造函数应该设计为:先拷贝对象主体,再为新建对象的指针分配一个堆对象,最后用原对象的堆对象拷贝新对象的堆对象。即分三步完成。7.2.5 在单链表模板中为什么要把List类说明成Node的友元类?为了直接访问结点的私有成员数据,以简化程序。7.2.6 双向链表与单向链表相比,操作上有什么优点?双向链表可以很方便地找到表结点的前驱和后继。单链表只能找后继。如要找前驱,必须从表头开始搜索,并一般要用两个工作指针。7.2.7 对比顺序栈与链栈各自的长处和短处。顺序栈可以随机
6、访问其中的元素,而链栈只能顺序访问。顺序栈必须先开一定大小内存空间,执行起来简单,速度快,但可能溢出。链栈内存空间随用随开,不会溢出,但执行复杂(不断地动态分配),速度慢。7.2.8 写出二叉树的定义。二叉树是结点的一个有限集合,该集合或为空,或是由一个根结点及两棵分别称为左子树和右子树的(注意有左右之分)互不相交的二叉树组成,其中左右子树分别可以为空子树或均为空树。7.2.9 什么是二叉树的遍历?所谓二叉树的遍历(binary tree traversal),就是遵从某种次序,查巡二叉树的所有结点,每个结点都被访问一次,而且仅访问一次。所谓“访问”指对结点施行某些操作,但不破坏它原来的数据结
7、构。二、编程与综合练习题7.3 给单链表类模板增加两个成员函数:删除链表中所有数据域为指定值的结点和取出链表中第K个元素(从1开始计数)。解:这两个成员函数添在单链表类模板中(ep7_3.h),删除函数中要比较数据域,该比较运算符应该在数据域类中重载(ep7_3data.h)。借用习题6.9字符串类Mystring,仅重载运算符=(拷贝),=(strcmp)。本例数据域用了类mystring,可以用其他类代替,这样的组织更通用,是标准的编程方式。习题中仅此题作了标准编程。使用整数型见解2。/ep7_3data.h#includeconst int n=256;class mystring ch
8、ar stringn; int maxsize; int last;public: mystring() last=-1; maxsize=n; string0=0; mystring(char *s)/本例为了简化,健壮性并不好 do last+; stringlast=slast; while(slast!=); mystring(mystring & ms) stringlast=ms.stringlast; while(lastms.last); mystring() void show()coutstringendl;/新增加的显示mystring的函数 mystring opera
9、tor=(const mystring & bool operator=(mystring &;mystring mystring:operator=(const mystring & ms)/返回值不可为引用 last=-1; do last+; stringlast=ms.stringlast; while(last return *this;bool mystring:operator=(mystring & int i=0,k; if(last!=ms.last) return false; k=stringi-ms.stringi; i+; while(k=0&ilast); if(
10、k!=0) return false; else return true;/ep7_3.h#includeep7_3data.h/首先看结点组织,采用结点类,凡与结点数据和指针操作有关函数作为成员函数templateclass List;class Node T info; /数据域 Node *link; /指针域 Node(); /生成头结点的构造函数 Node(const T & data);/生成一般结点的构造函数 void InsertAfter(Node* P); /在当前结点后插入一个结点* RemoveAfter(); /删除当前结点的后继结点,返回该结点备用 T & Geti
11、nfo();/增加取数据域函数 friend class List /以List为友元类,List可直接访问Node的私有函数,与结构一样方便,但更安全template Node()link=NULL;Node(const T & data) info=data; link=NULL;void NodeInsertAfter(Nodelink=link; link=p;Node* Nodelink; return tempP;Getinfo()return info;/增加取数据域函数/再定义链表类,选择常用操作:包括建立有序链表、搜索遍历、插入、删除、取数据等class List *head
12、,*tail;/链表头指针和尾指针 List(); /构造函数,生成头结点(空链表) List(); /析构函数 void MakeEmpty(); /清空一个链表,只余表头结点* Find(T data); /搜索数据域与data相同的结点,返回该结点的地址 int Length(); /计算单链表长度 void PrintList(); /打印链表的数据域 void InsertFront(Node* p); /可用来向前生成链表,在表头插入一个结点 void InsertRear(Node /可用来向后生成链表,在表尾添加一个结点 void InsertOrder(Node *p); /
13、按升序生成链表*CreatNode(T data); /创建一个结点(孤立结点)*DeleteNode(Node /删除指定结点*RemoveAll(T &/*删除链表中所有数据域为指定值的结点*/*GetNode(int);/*取出链表中第K个元素(从1开始计数)*/ListList() head=tail=new Node();List() MakeEmpty(); delete head;void Listlink!=NULL) tempP=head- head-link=tempP- /把头结点后的第一个节点从链中脱离 delete tempP; /删除(释放)脱离下来的结点 tail
14、=head; /表头指针与表尾指针均指向表头结点,表示空链* List while(tempP!=NULL&tempP-info!=data) tempP=tempP- /搜索成功返回该结点地址,不成功返回NULLint List int count=0; tempP=tempP- count+; return count;PrintList() tempP-info.show();/不能用cout,只能改用show()。 coutInsertFront(Node head-link=p; if(tail=head) tail=p;InsertRear(Node tail- tail=p;In
15、sertOrder(NodeinfoInsertAfter(p); /插在tempP指向结点之前,tempQ之后 if(tail=tempQ) tail=tempQ-CreatNode(T data)/建立新节点*tempP=new Node(data);DeleteNode(Node=p) tempP=tempP- if(tempP-link=tail) tail=tempP; return tempP-RemoveAfter();/本函数所用方法可省一个工作指针,与InsertOrder比较RemoveAll(T &p)/*利用已有的DeleteNode()*/ bool b=false;
16、*TempP=head-link,*TempR; while(TempP!=NULL)/*也可以利用尾指针*/ if(TempP-info=p) TempR=DeleteNode(TempP); TempP=TempP- return TempR;GetNode(int i) int j=1; if(i0) return NULL; if(i=0) return head;ji) j+; return TempP;/ep7_3.cppep7_3.hvoid main() const int h=9; int i; List list1; *n1,*P1; mystring m(东南大学),sph=南京大学,交通大学清华大学天津大学, 复旦大学浙江大学同济大学 for(i=0;h;i+) spi.show();i+) P1=list1.CreatNode(spi); list1.InsertFront(P1);/向前生成list1 list1.PrintList(); list1.RemoveAll(m);要求寻找第几个节点? cini; n1=list1.GetNode(i); n1-Getinfo().show();解2:这两个成员函数添在单链表类模板中(ep7_3_0.h),本例数据域使用整数型/ep7_3_0.h
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1