zz-简单结构算法C语言141112b

//zz//###################################################################################

zz-简单结构算法C语言141112b
zz-简单结构算法.txt

@2014-3-6 11:15:30
@2014-5-13 08:59:45
@2014-11-3 11:51:56
@2014-11-5 16:50:28
发现 AR_NUM-2 AR_NUM-1 不对
@2014-11-5 17:07:03
冒泡法,选择法是决出最小只交换1次
@2014-11-12 13:15:57
@

REF:

//zz//###################################################################################
1.
冒泡法,选择法排序
==> 这种是我修改后的冒泡排序(不是之前我认为的选择排序)
先拿 a[0] 逐个与 a[1]到a[N-1] 作比较 => 是否交换
再拿 a[1] 逐个与 a[2]到a[N-1] 作比较 => 是否交换
...以此类推,每次确定一个

1)
zz冒泡法

#define AR_NUM (10)ul

void maopao_sort()
{
int paixu[AR_NUM] = {5,4,8,6,9,4,8,2,0,1};
int i=0;
int j=0;
int itmp;

for(i=0; i<AR_NUM; i++)
printf("%d ",paixu[i]);

//zz// 自顶向下,决出最上面的那个元素,为最小
//for(i=0;i<AR_NUM-2;i++)
for(i=0;i<AR_NUM-1;i++)
{
//zz// 最上方i和下面每个元素比较,决出最小放位置i处
//for(j=i+1;j<AR_NUM-1;j++)
for(j=i+1;j<AR_NUM;j++)
{
if(paixu[i] > paixu[j])
{
itmp = paixu[j];
paixu[j] = paixu[i];
paixu[i] = itmp;
}
}
}

for(i=0; i<AR_NUM; i++)
printf("%d ",paixu[i]);
}

2)
zz选择法,区别就是内循环只做1次交换

#define AR_NUM (10ul)

void xuanze_sort()
{
int paixu[AR_NUM] = {5,4,8,6,9,4,8,2,0,1};
int i=0;
int j=0;
int li_tmp;
int li_idx;

for(i=0; i<AR_NUM; i++)
printf("%d ",paixu[i]);

//zz// 自顶向下,决出最上面的那个元素,为最小
for(i=0;i<AR_NUM-1;i++)
{
li_idx = i;

//zz// 最上方i和下面每个元素比较,决出最小放位置i处
for(j=i+1;j<AR_NUM;j++)
{
//if(paixu[i] > paixu[j])
if(paixu[li_idx] > paixu[j])
{
li_idx = j;
}
}

li_tmp = paixu[i];
paixu[i] = paixu[li_idx];
paixu[li_idx] = li_tmp;
}

for(i=0; i<AR_NUM; i++)
printf("%d ",paixu[i]);
}


//zz//###################################################################################
2.
随机数
srand((unsigned)time(NULL));

rand()%10
1 + rand()%10
10*rand()/(RAND_MAX+1)
1 + 10*rand()/(RAND_MAX+1)

ibeg + rand%(iend-ibeg)
ibeg + (iend-ibeg)*rand()/(RAND_MAX+1)


概率,例如5%
i = 100*rand()/(RAND_MAX+1)

srand((unsigned)time(NULL));
//随机数是否在 5% 区间内?
for(j=0;j<100;j++)
{
i = 100*rand()/(RAND_MAX+1)
if(i<5)
{
isel[j] = 1;
}
else
{
isel[j] = 0;
}
}


//zz//###################################################################################
3.
保留3位有效数字,四舍五入


float a = 3.1415926;
float b = 0;
float c = 0;

b = ((int)(a*1000.0))/1000.0

//四舍五入用 +0.5 实现 => int强制类型转换是直接去小数部分,故+0.5的话原来大于等于0.5就会变成1
c = ((int)(a*1000.0+0.5))/1000.0


#######################
数量对齐,例如对500对齐(同4.向上取整)
int a = 185321;

b = (a+500-1)/500;
c = ((a+500-1)/500)*500;




//zz//###################################################################################
4.
C除法 向上取整


REF:
<< Mini2440-Linux移植开发实战指南zz140416.pdf >>
3.12.1 LCD 驱动基础知识


#define DIV_ROUND_UP(n,d)  (((n) + (d) - 1) / (d)) 
这其实是一个数学概念:向上取整。下面是关于“向上取整”的一段说明


n 对 d 向上取整,比如说每个最小单元能存 d 个数据,问存储 n 个数据需要多少个这样的单元
(n + (d-1))/d




//zz//###################################################################################
5.
链表
双向链表
双向环形链表


#define LIST_CIRCLE 1
typedef _dlist_type
{
_dlist_type *prev; // 单向链表无此项
_dlist_type *next;

int id;
void *data;
} dlist_type


int init_list(int num,dlist_type* phead)
{
int i=0;
dlist_type* plist;
dlist_type* ptemp;

ptemp = new dlist_type;
//ptemp = (dlist_type *)malloc(sizeof(dlist_type));

phead = ptemp;

for(i=0;i<num;i++)
{
plist = new dlist_type;
//plist = (dlist_type *)malloc(sizeof(dlist_type));

ptemp->next = plist;
plist->prev = ptemp;

ptemp = ptemp->next;
}


#if LIST_CIRCLE>0
// 建立双向环形链表
ptemp->next = phead;
phead->prev = ptemp;
#else
// 建立双向非环形链表
ptemp->next = NULL;
phead->prev = NULL;
#endif
}


//zz//###################################################################################
6.
linux 中的双向链表 list_head结构体 list_entry宏定义


要点:
list_head 里面就两个东西,指向 list_head类型结构的 prev 和 next 指针
要用到链表的结构体中,放一个 list_head 结构体在里面就可以

使用 list_entry 宏,根据XXX结构体变量内 list_head 结构体的两个指针,来得到XXX结构体变量(即XXX的地址或者说指针)
根据内存偏移( list_head 在XXX内的偏移)来做到的

代码:

struct list_head {
         struct list_head *next, *prev;
};


#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))


member是 list_head 变量在 type 结构体内的变量名
ptr 是输入,用来查找type结构体变量的 list_head 结构体变量的指针
返回的是,ptr 所指向的 list_head 结构体所在的 type(用户自定的) 结构的指针..


//zz//###################################################################################



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值