本来想总结先这两天的东西,但是这两天真的很差劲,因为在琢磨这个硬币问题,就是从n个外观相同的硬币中找出一个重量不同的的。用数组存重量,标号就是数组下标了。决定采用二分法,然后递归,但是做到后边发现:奇数偶数问题,咋分了,想了下,当为奇数时可以去掉一个,看前偶数个,如果没问题那就是去掉的那个有问题了。
首先分成两拨,当然测试的是偶数个的时候,分成两拨之后定义出标志0为轻,1为重,
2.进行第二次进一步分成两拨,如果那拨有问题那么就着重分析那拨。
3.就是采用二分法和递归来搞定。
LEI:自己很差劲,没能搞定,搁浅了。写着发现很多问题,越写越乱。有不愿意看别人的,主要是想好好弄下递归这个东西,老感觉不对劲。继续努力吧。争取下次贴上。
今天练习了一下单链表。还是有点收获,虽然很多地方出错了,然后照着资料改了改,最后还是行的。首先链表是在类的构造函数中初始化的:
LinkList::LinkList()//初始化
{
head = (LNode *)malloc(sizeof(LNode));//这里其实是c的用法了,可以用head = new LNode;
head->data = NULL;
head->next = NULL;
}
LinkList::~LinkList()
{
LNode *p = head->next;
while(p)
{
free(p);
p = p->next;
}
}
问题一:但是我没有对这个析构函数进行定义和实现,所以问题就出现了。程序报错,说是无法链接外部的~LinkList(),我就感觉到必须要定义析构函数,似乎是成对出现的。不仅要定义,必须在实现文件.cpp中去调用,哪怕内容为空都可以,不然的话也会报错:说是无法解析外部命令之类的。看来自己以前学的只是小不点啦。具体的原理现在还在研究当中。后续:
看了下别人的解释,编译器会把构造函数编程一段代码放入称为_PVFV的数组中,然后有个_initterm参数中的pfbegin就指向这个数组的第一个元素,pfend指向这个数组的最后一个元素(总为NULL),我们的构造函数就这样被调用了,析构就遵循LIFO原则,这就是上面的魔术的工作原理。
同时注意父类和子类的构造函数顺序和析构函数顺序,具有楼梯层次观,先析构了子类,在析构父类,这样才保证运行正常。这应该是一种工作机制吧。我认为。
问题二: 成员初始化的问题
在C++中,只有静态常量成员可以初始化,比如 static const int a = 2;
其它的如static int a = 2;//错
const int a = 2;//错
int a =2 ;//错
一般最好不要在定义的时候初始化,可以在构造函数中去初始话,这样好点。
static的int型要写在外面。double的可以写在里面,effective C++里面有讲到的,不过可能旧的编译器不支持也有可能。
菜鸟:for 循环可以这样用,只是没用过,大惊小怪了自己
for(k=1;p!=NULL;k++,p = p->next)
阅读(1937) | 评论(0) | 转发(0) |