【练习回顾】DS前三次作业
第一次作业
T2.基本计算器
使用了数组栈——数字栈和符号栈
T5.全排列输出(permutation)
使用了标准写法——字典序算法
void reverse(int left,int right);/*逆转a[left]~a[right]顺序*/
int nextPermutation(int n)/*1~n的全排列*/
{
int i,j;
for(i=n-1;i>0 && a[i]<a[i-1];i--); //从后向前,找到当前排列中首个a[i-1]<a[i](升序)的位置——即子列峰值
if(i==0) return 0;
else
{ //从a[i]开始向后,找到子排列中首个比a[i-1]小的a[j],这样a[j-1]就是最小的比a[i-1]大的数,是a[i-1]下一个全排列的目标值(我们就是这么想的)
//于是交换a[i-1]和a[j-1]的值,再将其后的子列逆序以期得到极小的排列增长(其实就有递归的思想)
for(j=i;j<n && a[j]>a[i-1];j++);
a[j-1]^=a[i-1],a[i-1]^=a[j-1],a[j-1]^=a[i-1];
reverse(i,n-1);
return 1;
}
}
/*主体操作,a[0]~a[n-1]全排列输出*/
do{
for(i=0;i<n;i++) printf("%d ",a[i]);
puts(""); //输出
}while(nextPermutation(n)); //得到下一个排列
return 0;
e.g.
1 3 5 4 2
1 3 5 4 2 a[i-1]=3 从后向前首个升序处,也是下一个排列的目标更改出
1 3 5 4 2 a[j-1]=4 大于a[i-1]的极小值
1 4 5 3 2 此后子列必倒序逆序排列即可
1 4 2 3 5 < FINAL
第二次作业
选填
关于优先级:
[] , () , . , -> | * , & ,++/-- |
---|---|
从左向右 1 | 从右向左 2 |
一些可移植性差的函数警惕
feof()
fflush()
第三次作业
T3.链表存储多项式时,野指针读入的错误及其衍生错误
typedef struct node
{
int coef;
int exp;
struct node *link;
} PNode, *PLinklist; /*链表形式*/
PLinklist readPoly() /*读入多项式*/
{
PLinklist list=NULL;
//应为想用作接口,使用了局部的变量list来普遍化操作,结果忘记赋值成了野指针,在配合上本地CodeBlocks编译器的环境优化,产生了千奇百怪的错误结果
PLinklist p,r;
do
{
p=(PLinklist)malloc(sizeof(PNode));
scanf("%d%d",&p->coef,&p->exp);
p->link=NULL;
if(list==NULL) list=p; //若为野指针,此处list==NULL就挂了
else r->link=p;
r=p;
}while(getchar()!='\n');//当检测到行末'\n'后结束
return list;
}
此次大失误让人进一步了解了自己编译器的尿性(猜测):
咱的编译器会给野指针沿用之前历史的值,若没有历史则赋为NULL;
然后如果中间有些扰动(在其他域申明了相同名字的变量时)就会丢弃历史值。
因而两个链表连缀起来了
然而有些错误尚无法解释,需进一步研究:
加入printf("sf");
后只读入前半,直接爆炸
加入printf("sf\n");
就不会如此
T1.多线段连缀,找最长连续线段
由于数据点弱,感觉什么算法都能过,但自己竟然卡了那么久;
使用了自创的想法:单链表表示线段,单循环链表记录每条线段的头结点(方便顺次循环比较)
因为忽视了循环链表表头丢失的可能性
typedef struct node
{ /* 记录一条连续线段*/
int x;
int y;
struct node *link;
} LNode, *Line;
typedef struct circleHead
{
Line head; /* 记录每个连续线段头结点*/
int num; /* 记录该连续线段的组成线段数*/
struct circleHead *link;
} CNode, *hCoord;
int doConnect(int last) //还是无脑的循环比较,直至线段集合不再变动
{
int i=0;
hCoord p=Clist,q,pre;
Line pp,rr;
while(i<last)
{
pp=p->head;
while(pp->link!=NULL) pp=pp->link;
rr=pp;
for(q=p->link,pre=p;q!=p;pre=q,q=q->link)
{
if(isConnect(q->head,rr))
{
rr->link=q->head->link;
p->num+=q->num;
pre->link=q->link;
last--;
i=0;//清零,否则会有跳过的可能性(好傻!)
break;
}
}
if(q==p) i++;
else
{
free(q);
continue;
}
p=p->link;
Clist=p; /* 注意当p不是Clist时,可能会因为Clist所指的结点移动到p结点后而导致Clist丢失*/
}
return last;
}
此题助教推荐了并查集,学学去
第三次作业的两个重大失误,源自于对链表指针的忽视,今后要特别注意
【练习回顾】DS前三次作业的更多相关文章
- OPP前三次作业总结
OPP前三次作业总结 目录 前言: 第一次OOP训练: 7-7 有重复的数据 设计与分析: 具体代码 踩坑心得 改进建议 7-8 从一个字符串中移除包含在另一个字符串中的字符 设计与分析: 具体代码 ...
- OO前三次作业总结
一.第一次作业 1.程序设计分析  图1 第一次作业类图 
前三次作业总结 1.前言 (1)第一次题目集共有8道题目,难度较为简单,知识点为JAVA的一些编程基础知识点,如输入输出,选择,循环,一维数组等. (2)第二次题目集共有5道题目,难度较第一次题目集有 ...
- OO前三次作业思考(第一次OO——Blog)
OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...
- OO课程第一阶段(前三次作业)总结Blog1
OO课程第一阶段(前三次作业)总结Blog1 前言:学习OOP课程的第一阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. (1)相比于另外两次作业,第一次作业基本上是基本的编程的语法训练,题 ...
- OO前三次作业分析
一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...
- 第一次码java感想及前三次作业总结
写在前面 嗯,首先是java,这学期第一次oo作业布置下来的周末才开始看的,第一次作业因此写得有些手忙脚乱.不过大概看了一遍后发现比c好用,入门更简单吧,好多操作直接import一下就能用了,码代码的 ...
- OO第四次作业-对前三次作业总结
第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...
- OO前三次作业简单总结
随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...
- oo前三次作业博客总结
第一次作业 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3 ...
随机推荐
- RedisTemplate配置的jackson.ObjectMapper里的一个enableDefaultTyping方法过期解决
1.前言 最近升级SpringBoot,从2.1.6版本升级到2.2.6版本,发现enableDefaultTyping方法过期过期了. 该方法是指定序列化输入的类型,就是将数据库里的数据安装一定类型 ...
- Qt编写物联网管理平台49-设备模拟工具
一.前言 本系统专门配备了设备模拟工具,用来在没有外接真实设备的时候,模拟modbus协议数据,支持多个设备,支持串口和网络方式,可切换正常数据和报警数据,反应到主程序上.对应主程序中两种端口,一种是 ...
- Qt开发经验小技巧151-155
当Qt中编译资源文件太大时,效率很低,或者需要修改资源文件中的文件比如图片.样式表等,需要重新编译可执行文件,这样很不友好,当然Qt都给我们考虑好了策略,此时可以将资源文件转化为二进制的rcc文件,这 ...
- error: undefined reference to `cv::imread(cv::String const&, int)' 解决方法
方法1 原文链接:https://blog.csdn.net/WhiteLiu/article/details/72901520 编译时出现下列错误: undefined reference to ' ...
- 如何查看一个域名所对应的IP地址?
具体步骤如下: 1.点击电脑左下角开始菜单,打开"运行"选项. 2.然后输入"cmd"并打开. 3.在弹出的页面输入ping+你想要查看的域名,比如新浪网,pi ...
- MySql 建表出现的问题 : [ERR] 1064 - You have an error in your SQL syntax; check the manual.......
使用 MySql 建表出现的问题 在使用 Navicat Premium 运行 sql 语句进行建表时,MySQL 报错如下: 1064 - You have an error in your SQL ...
- JVM实战—5.G1垃圾回收器的原理和调优
大纲 1.G1垃圾回收器的工作原理 2.G1分代回收原理-性能为何比传统GC好 3.使用G1垃圾回收器时应如何设置参数 4.如何基于G1垃圾回收器优化性能 5.问题汇总 1.G1垃圾回收器的工作原理 ...
- 如何快速的开发一个完整的iOS直播app(推流篇)
开发一款直播app,肯定需要流媒体服务器,本篇主要讲解直播中流媒体服务器搭建,并且讲解了如何利用FFMPEG编码和推流,并且介绍了FFMPEG常见命令. 效果 一.安装Homebrew Homebre ...
- crontab 定时任务详细讲解
crontab crontab的服务进程名为crond,英文意为周期任务.crontab在Linux主要用于周期定时任务管理.通常安装操作系统后,默认已启动crond服务.crontab可理解为cro ...
- 【java提高】---细则(1)
异常 一.异常与错误的区别 再讲异常之前我们就应该要知道异常和错误的区别 Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的问题,如系 ...