发新帖我要提问
123
返回列表
打印

C算法大讨论:关于数组移动的,每次都更新一个数

[复制链接]
楼主: gudeng614
手机看帖
扫描二维码
随时随地手机跟帖
41
冷嬷嬷又开始脑残了。
你的256,300的脑残问题的答案都在29楼。36楼是告诉你:在这个帖子算法讨论里, 你贴一遍代码,你是在讨论,你贴三遍那种还不如36楼连最低级菜鸟都能写出来的简单代码,你冷漠就是脑残了。

使用特权

评论回复
42
lxyppc| | 2010-5-14 22:57 | 只看该作者
to 40楼
如果真的算法需要写300条差不多的语句,用excel是能很轻松完成的,不一定要打很多字

使用特权

评论回复
43
highgear| | 2010-5-14 23:20 | 只看该作者
lxyppc 我不得不顶你, 希望以后可以与你交流一下 ecel 的心得。
在我的各种项目里, 大量的使用了 excel. 不仅数据分析和图表, 连程序所需的 C/C++ 代码(主要是数据代码), 都是 excel + VBA 生成的。

跑题了, 呵呵.

使用特权

评论回复
44
冷漠| | 2010-5-17 08:43 | 只看该作者

菜鸟冷漠玩的第三个花样:链表。

本帖最后由 冷漠 于 2010-5-17 09:06 编辑

菜鸟冷漠玩的第三个花样:链表。还望高手多多容忍、指教。

#include<reg51.h>
#include<stdio.h>
#include<stdlib.h>

void main(void)
{
int i;
//  链表结构
struct listEntry{
char value;
struct listEntry *next;
}start,*node;

   init_mempool(0x1000,20*sizeof(struct listEntry));  // 缓冲池
   start.next=NULL;    //  空表
   node=&start;

for(i=1;i<9;i++)         //  创建节点值为1到8的链表。
{
    node->next= (struct listEntry *)malloc(sizeof(struct listEntry));   //  为新节点分配内存
  node=node->next;
  node->value=i;
  node->next=NULL;
}
// 遍历链表。 输出显示节点值。
node=start.next;
while(node)
{  
printf("%c",node->value);
node=node->next;
}
while(1);
}


使用特权

评论回复
45
反质子| | 2010-5-17 13:47 | 只看该作者
冷漠 功力很深呀 :lol

使用特权

评论回复
46
highgear| | 2010-5-17 21:24 | 只看该作者
俺也不多说:  连表最大的意义在于伸缩性, 可以任意添加, 删除, 插入而没有额外的性能损失.

简单的点评一下 45 楼的单向连表:
.) start 节点没有使用上
. )  连表没有体现出如何删除和添加, 这才是重点所在.
. ) 单向连表删除旧节点,添加新节点, 会有额外的性能惩罚, 因为当前节点只有next, 而没有previous node, 所以只能遍历节点。


双向linked list:
struct listEntry{
  char value;
  struct listEntry *next;
  struct listEntry *previous;  //关键之处   
}start, *header, *tail, *node;


void LinkList_Init()
{
    header = &start;
    tail = header;
    header->next = NULL;
    header->previous = NULL;
}

void LinkList_AddNode(struct listEntry* newNode)  //newNode 在子程序外产生。
{
   tail->Next = newNode;   
   newNode->next = NULL;
   newNode->previous = tail;
   tail = newNode;   //新节点成为新尾巴
}

void LinkList_DeleteNode()   //被删除的node 在子程序外处理, 如销毁等
{
    if (tail->previous != NULL) {
      tail = tail->previous;
      tail->nexe = NULL;
    }
}

这样, 可以使用45楼的连表解决更多数据输入的问题: 例如再加入一个数据:
node = (struct listEntry *)malloc(sizeof(struct listEntry));
node->value = input;
LinkList_AddNode(node);

或者简单的实现circular buffer, 把尾巴砍下来作为头:
ASSERT(tail->previous != NULL);  //确认至少有2个node;
node = tail;
tail = tail->previous;
tail->next = NULL;   //确保可以遍历.
header->previous = node;
node->next = header;
node->previous = NULL;
tail->value = input;

另外,双向连表很容易解决插入节点的问题, 这里就不讲了.

使用特权

评论回复
47
highgear| | 2010-5-17 21:29 | 只看该作者
楼上错了一点:
node->previous = NULL;
header = node;   //旧的尾部成为头
header->value = input;  //输入放入新的头内.

使用特权

评论回复
48
xuyiyi| | 2010-5-18 05:55 | 只看该作者
学习了,highgear 老师真是C语言绝顶高手。

冷漠大虾 功力也不错,比我强多啦,:lol

使用特权

评论回复
49
mxh0506| | 2010-5-19 15:26 | 只看该作者
个人认为,如果需要通过复制数据块移动数据的话,只要调用现成的库函数就行了,相关的算法、代码优化,甚至与目标芯片指令集相关的问题都交给做C库函数的去做,毕竟是在用C编程。
当然,需要100%程序有源码的特殊行业除外。

使用特权

评论回复
50
冷漠| | 2010-5-19 17:26 | 只看该作者
有这样的库函数吗?盼望50楼写一个大概思路,难得这么好的互相学习的机会。

使用特权

评论回复
51
kqian0327| | 2010-5-19 19:59 | 只看该作者
七楼一看就是高手!!!

使用特权

评论回复
52
mqp108| | 2010-5-19 21:31 | 只看该作者
学习:)

使用特权

评论回复
53
xblei| | 2010-5-20 12:59 | 只看该作者
领教各位了。

使用特权

评论回复
54
fzy_666| | 2010-5-22 14:44 | 只看该作者
这个做个指针运算就可以了,和移位算法差不多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则