课程主页在
http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在
云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。
(1)编写make_list2()函数建立链表,使建立链表时,后输入的数据,将新输入的数字对应的结点放在链表末尾。若输入为3 5 2 9 4 7 0,建立的链表为:
(2)编写函数void search(int x),输出链表中是否有值为x的结点。
(3)编写函数delete_first_node(),删除链表中的第一个结点。
(4)编写函数delete_node(int x),删除结点值为x的结点。
(5)编写make_list3()函数建立链表,使建立链表时,使结点中的数据呈现升序。若输入为3 5 2 9 4 7 0,建立的链表为:
(6)编写函数void insert(int x),将值为x的结点插入到由make_list3建立起来的有序链表中。
【项目2-猴子选大王】
一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈。从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。输入m和n,输出为大王的猴子是几号。
提示1:(1)链表解法:可以用一个循环的单链表来表示这一群猴子。表示结点的结构体中有两个成员:一个保存猴子的编号,一个为指向下一个人的指针,编号为m的结点再指向编号为1的结点,以此构成环形的链。当数到第n个时,该结点被删除,继续数,直到只有一个结点。(2)使用结构数组来表示循环链:结构体中设一个成员表示对应的猴子是否已经被淘汰。从第一个人未被淘汰的数起,每数到n时,将结构中的标记改为0,表示这只猴子已被淘汰。当数到数组中第m个元素后,重新从第一个数起,这样循环计数直到有m-1被淘汰。
提示2:该题为计算机科学中的经典问题,很多实际的问题可以抽象到这种模型上来。感兴趣的同学请搜索“约瑟夫问题”。
【项目3-应用枚举】
(1)阅读教材7.3节,了解枚举类型的一般用法。阅读下面输出He先生买车方案的程序,理解使用枚举类型的意义。
(2)设计函数,可以按指定的方式,输出一个平面点的对称点
下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。
【项目4-点和距离】
读程序,写出函数的定义,注意其中枚举类型的用法
【项目5-读懂“共同体”】
运行下面的程序,并解释运行结果。
【项目1 - 动态链表体验】
#include <iostream> using namespace std; struct Node { int data; //结点的数据 struct Node *next; //指向下一结点 }; Node *head=NULL; //将链表头定义为全局变量,以便于后面操作 void make_list(); //建立链表 void out_list(); //输出链表 int main( ) { make_list(); out_list(); return 0; } void make_list() { int n; Node *p; cout<<"输入若干正数(以0或一个负数结束)建立链表:" cin>>n; while(n>0) //输入若干正数建立链表,输入非正数时,建立过程结束 { p=new Node; //新建结点 p->data=n; p->next=head; //新建的结点指向原先的链表头 head=p; //链表头赋值为新建的节点,这样,新结点总是链表头 cin>>n; //输入下一个数,准备建立下一个结点 } return; } void out_list() { Node *p=head; cout<<"链表中的数据为:"<<endl; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; return; }
在上面的程序基础上定义下面的函数,实现相应的功能。
为简便起见,每编写一个函数,立刻在main函数中调用进行测试。(1)编写make_list2()函数建立链表,使建立链表时,后输入的数据,将新输入的数字对应的结点放在链表末尾。若输入为3 5 2 9 4 7 0,建立的链表为:
(2)编写函数void search(int x),输出链表中是否有值为x的结点。
(3)编写函数delete_first_node(),删除链表中的第一个结点。
(4)编写函数delete_node(int x),删除结点值为x的结点。
(5)编写make_list3()函数建立链表,使建立链表时,使结点中的数据呈现升序。若输入为3 5 2 9 4 7 0,建立的链表为:
(6)编写函数void insert(int x),将值为x的结点插入到由make_list3建立起来的有序链表中。
【项目2-猴子选大王】
一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈。从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。输入m和n,输出为大王的猴子是几号。
提示1:(1)链表解法:可以用一个循环的单链表来表示这一群猴子。表示结点的结构体中有两个成员:一个保存猴子的编号,一个为指向下一个人的指针,编号为m的结点再指向编号为1的结点,以此构成环形的链。当数到第n个时,该结点被删除,继续数,直到只有一个结点。(2)使用结构数组来表示循环链:结构体中设一个成员表示对应的猴子是否已经被淘汰。从第一个人未被淘汰的数起,每数到n时,将结构中的标记改为0,表示这只猴子已被淘汰。当数到数组中第m个元素后,重新从第一个数起,这样循环计数直到有m-1被淘汰。
提示2:该题为计算机科学中的经典问题,很多实际的问题可以抽象到这种模型上来。感兴趣的同学请搜索“约瑟夫问题”。
【项目3-应用枚举】
(1)阅读教材7.3节,了解枚举类型的一般用法。阅读下面输出He先生买车方案的程序,理解使用枚举类型的意义。
#include <iostream> using namespace std; enum Color {red,black,white}; enum Brand {lavida,tiggo,skoda}; int main( ) { int color,brand; for(color=red; color<=white; color++) for(brand=lavida; brand<=skoda; brand++) if(!((color==red&&brand==tiggo) ||(color==white&&brand==skoda))) { switch(color) { case red: cout<<"红"; break; case black: cout<<"黑"; break; case white: cout<<"白"; break; } switch(brand) { case lavida: cout<<"Lavida"<<endl; break; case tiggo: cout<<"Tiggo"<<endl; break; case skoda: cout<<"Skoda"<<endl; break; } } return 0; }
(2)设计函数,可以按指定的方式,输出一个平面点的对称点
下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。
#include<iostream> using namespace std; enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void output(double,double,SymmetricStyle); int main() { int x,y; cout<<"输入点的坐标:"; cin>>x>>y; cout<<"关于x轴的对称点是:"; output(x,y,axisx); cout<<"关于y轴的对称点是:"; output(x,y,axisy); cout<<"关于坐标原点的对称点是:"; output(x,y,point); return 0; }
【项目4-点和距离】
读程序,写出函数的定义,注意其中枚举类型的用法
enum SymmetricStyle {axisx,axisy,point};//分别表示按x轴, y轴, 原点对称 struct Point{ double x; // 横坐标 double y; // 纵坐标 }; double distance(Point p1, Point p2); // 两点之间的距离 double distance0(Point p1); Point symmetricAxis(Point p,SymmetricStyle style); //返回对称点 int main( ){ Point p1={1,5},p2={4,1},p; cout<<"两点的距离为:"<<distance(p1,p2)<<endl; cout<<"p1到原点的距离为:"<<distance0(p1)<<endl; p=symmetricAxis(p1,axisx); cout<<"p1关于x轴的对称点为:"<<"("<<p.x<<", "<<p.y<<")"<<endl; p=symmetricAxis(p1,axisy); cout<<"p1关于y轴的对称点为:"<<"("<<p.x<<", "<<p.y<<")"<<endl; p=symmetricAxis(p1,point); cout<<"p1关于原点的对称点为:"<<"("<<p.x<<", "<<p.y<<")"<<endl; return 0; } // 求两点之间的距离 double distance(Point p1,Point p2) { double d; …… return d; } // 求点到原点的距离 double distance0(Point p) { double d; …… return d; } // 求对称点 Point symmetricAxis(Point p1,SymmetricStyle style) { Point p; …… return p; }
【项目5-读懂“共同体”】
运行下面的程序,并解释运行结果。
#include <iostream> using namespace std; union un { int i; char c[4]; }; int main() { union un x; x.c[0]='A'; x.c[1]='B'; x.c[2]='C'; x.c[3]='D'; cout<<x.i<<endl; return 0; }
=================== 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| |== 我写的书——《逆袭大学——传给IT学子的正能量》 ==| ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ===== |