11、判断单链表中是否存在环
#include "stdafx.h"
typedef char eleType; // 定义链表中的数据类型
typedef struct listnode { // 定义单链表结构
eleType data;
struct listnode *next;
}node;
node *create(int n) { // 创建单链表,n为节点个数
node *p = (node *)malloc(sizeof(node));
node *head = p; head->data = 'A';
for(int i='B'; i<'A'+n; i++) {
p = (p->next = (node *)malloc(sizeof(node)));
p->data = i;
p->next = NULL;
}
return head;
}
void addCircle(node *head, int n) { // 增加环,将链尾指向链中第n个节点
node *q, *p = head;
for(int i=1; p->next; i++) {
if(i==n) q = p;
p = p->next;
}
p->next = q;
}
int isCircle(node *head) { // 这是笔试时需要写的最主要函数,其他函数可以不写
node *p=head,*q=head;
while( p->next && q->next) {
p = p->next;
if (NULL == (q=q->next->next)) return 0;
if (p == q) return 1;
}
return 0;
}
int main(int argc, char* argv[]) {
node *head = create(12);
addCircle(head, 8); // 注释掉此行,连表就没有环了
printf("%d\n", isCircle(head));
}
2、cocos2d-x内管管理
目前主要有两种实现智能管理内存的技术,一种是引用计数,一种是垃圾回收。Cocos2d-x采用的是引用计数机制。为此实现了自己的根类Ref,每个对象都包含了一个用来控制生命周期的引用计数器,就是Ref的成员变量m_uReference。
对于m_uReference,构造函数创建时对该引用计数器赋值为1(自引用,并没有实际的使用),当需要引用对象时调用retain()方法增1,当引用结束的时候调用release()方法减一。而autorelease()方法(create工厂方法迫切需要)会将对象放入自动回收池(AutoReleasePool)实现灵活的垃圾回收。当每一帧结束的时候,自动回收池中的对象都会被执行一次release()
autorelease()方法里面代码将该对象添加到自动释放池中:PoolManager::sharedPoolManager()->addObject(this);
create方法将对象加入内存池后,对象的所有权已经属于内存池了, 我们返回的指针其实是没有所有权的. 主循环mainloop干了件非常重要的事情, 那就是pop最上层的autoreleasepool, 此时是在release全部仅仅由此内存池所有的对象.就是依靠这样的原理, 我们可以放心的将对象放在autoreleasepool中, 知道在需要的时候, 这个对象就能正确的释放, 同时只要有上层的父节点通过addChild对游戏对象有了所有权以后, 又能正确的保证该对象不会被删除.
如果在一帧之内生成了大量的autorelease对象,将会导致回收池性能下降。因此,在生成autorelease对象密集的区域(通常循环中)的前后,我们最好可以手动创建并释放一个回收池。