第一次作业

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前三次作业的更多相关文章

  1. OPP前三次作业总结

    OPP前三次作业总结 目录 前言: 第一次OOP训练: 7-7 有重复的数据 设计与分析: 具体代码 踩坑心得 改进建议 7-8 从一个字符串中移除包含在另一个字符串中的字符 设计与分析: 具体代码 ...

  2. OO前三次作业总结

    一.第一次作业 1.程序设计分析 ![img](s1.ax1x.com/2018/04/02/CSgoSU.png) 图1 第一次作业类图 ![name](https://images2018.cnb ...

  3. Blog总结(前三次作业总结)

    前三次作业总结 1.前言 (1)第一次题目集共有8道题目,难度较为简单,知识点为JAVA的一些编程基础知识点,如输入输出,选择,循环,一维数组等. (2)第二次题目集共有5道题目,难度较第一次题目集有 ...

  4. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  5. OO课程第一阶段(前三次作业)总结Blog1

    OO课程第一阶段(前三次作业)总结Blog1 前言:学习OOP课程的第一阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. (1)相比于另外两次作业,第一次作业基本上是基本的编程的语法训练,题 ...

  6. OO前三次作业分析

    一,第一次作业分析 度量分析: 第一次的oo作业按照常理来说是不应该有这么多的圈复杂度,但是由于第一次写的时候,完全不了解java的相关知识,按照c语言的方式来写,完全的根据指导书的逻辑,先写好了正确 ...

  7. 第一次码java感想及前三次作业总结

    写在前面 嗯,首先是java,这学期第一次oo作业布置下来的周末才开始看的,第一次作业因此写得有些手忙脚乱.不过大概看了一遍后发现比c好用,入门更简单吧,好多操作直接import一下就能用了,码代码的 ...

  8. OO第四次作业-对前三次作业总结

    第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...

  9. OO前三次作业简单总结

    随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...

  10. oo前三次作业博客总结

    第一次作业 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3 ...

随机推荐

  1. HTTP协议中,Content-Type(内容类型)讲解

    在基于HTTP协议进行Web开发时,客户端请求经常会发送请求文件或媒体的类型(Type),为了编译理解和总体把握,在本人总结了一下常用的文件或媒体类型,支持的类型大致有以下9种: 文本:text.图像 ...

  2. JVM实战—10.MAT的使用和JVM优化总结

    大纲 1.线上大促活动导致的老年代内存泄漏和FGC(MAT分析出本地缓存没处理好) 2.百万级数据误处理导致频繁FGC(大数据量加载到内存处理 + String.split()) 3.JVM运行原理和 ...

  3. C#/.NET/.NET Core技术前沿周刊 | 第 20 期(2025年1.1-1.5)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  4. Hadoop 概述(二)

    shell定时上传linux日志信息到hdfs 从标题可以分析出来,我们要使用到shell,还要推送日志信息到hdfs上. 定义出上传的路径和临时路径,并配置好上传的log日志信息.这里我使用了上一节 ...

  5. weixueyuan-Nginx Web服务4

    https://www.weixueyuan.net/nginx/web/ Nginx静态资源服务器搭建 HTML 是一种标记语言,提供 HTML 文件读取是静态服务器最基本的功能,静态服务器的配置样 ...

  6. java代码之美(2)

    guava 复写Object常用方法 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方 ...

  7. Superset 筛选器理解

    免于被筛选器筛选,dashboard中,编辑,高级,"__time_range": {"scope": ["ROOT_ID"], " ...

  8. Kotlin:【初始化】主构造函数、在主构造函数里定义属性、次构造函数、默认参数、初始化块、初始化顺序

  9. 认识soui4js(第4篇):定义一个窗口类,响应控件的事件

    soui4js基于soui4设计实现. 首先我们看一下soui4中如何定义一个窗口类. soui4最基本的窗口类是SHostWnd和SHostDialog,它需要一个布局xml. 假定布局xml在资源 ...

  10. MySql执行Sql语句时出现“MySqlException: Parameter ‘@maxNo‘ must be defined.”的错误

    1.问题描述 具体执行的SQL和报错的信息如下图所示: 2.解决办法 连接字符串中增加Allow User Variables=True;的配置即可,如下所示: Server=192.168.2.1; ...