c++ - 循环列表遍历引擎

标签 c++ c data-structures scheduling circular-dependency

我想以给定的输入顺序遍历一个循环链表(v1->v2->v3),比如说

{v1,v3,v2,v2,v1,v3,v2,v1,v1,v3,v2,v2,v1,v2,v3}

我编写了以下程序作为 3 个节点的测试,并希望逐步扩展到 8、64、512、4096 等节点。

我的实现想法要求以下程序仅在 抽象状态机 上运行,它只接受以下函数作为输入进行处理。我基本上想在遍历时尽量减少 engine_spin_at_gear() 的循环次数。我可能处于 non-blocking 模式,使用这种疯狂的 abstraction 来模仿/虚拟化 process-execution 作为 engine- spin 的测量单位为 rpm,但我真的很想获得有关调试 engine_spin_at_gear() 函数的建议。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MILES 15

struct package
{
        // ... other members data ...
        struct package *next;
}*v1, *v2, *v3;

int input_arr[MILES] = {1,3,2,2,1,3,2,1,1,3,2,2,1,2,3};

struct package *base(struct package *_vN)
{
        if (_vN)
                return _vN;
        else
                return NULL;
}

struct package *deliver(struct package *_vNP)
{
        if (_vNP)
                return base(_vNP->next);
        else
                return NULL;
}

void shift_gear(struct package *_feed)
{
        _feed->next = NULL;
}

struct package *engine_spin_at_gear(struct package *_init_cycle0, int countSession)
{
        while (countSession--) {
                shift_gear(_init_cycle0);
                return deliver(base(_init_cycle0));
        }
        return NULL;
}

struct package *journey(struct package *_current_frame, int _start, int _end)
{
        int rpm = (_end > _start)?_end-_start:_start-_end;
        if (rpm)
                return engine_spin_at_gear(_current_frame, rpm);
        else
                return v1;
}

struct package *ignition_phase(int _batteryS, int _chargedL)
{
        return journey(v1, _batteryS, _chargedL);
}


void transmit_in_order(int*input_arr)
{
        struct package *v6;
        int i;

        for (i=0; i<MILES-1; i++) {
                v6 = ignition_phase(input_arr[i], input_arr[i+1]);
                printf("%p\n", v6);
        }
}

int main()
{
        v1 = malloc(sizeof(struct package));
        v2 = malloc(sizeof(struct package));
        v3 = malloc(sizeof(struct package));

        v1->next = v2;
        v2->next = v3;
        v3->next = v1;

        printf("v1=%p\tv2=%p\tv3=%p\n", v1, v2, v3);
        transmit_in_order(input_arr);
        return 0;
}

当我在 Linux 上运行程序的 GCC 可执行文件时,我得到以下输出。

v1=0x918b008    v2=0x918b018    v3=0x918b028
(nil)
(nil)
0x918b008
(nil)
(nil)
(nil)
(nil)
0x918b008
(nil)
(nil)
0x918b008
(nil)
(nil)
(nil)
(nil)

或者,我是否需要更改 shift_gear() 函数?我可以在保持 scalability-factor 不变的同时进一步优化它吗?提前致谢。如果我想将所有这些功能放在 C++ 中作为 Class EngineClass Gearbox,你能给我一个原型(prototype)吗?

最佳答案

你提到扩展到更多的项目,这里是一些扩展到 100 的部分,

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

typedef struct package_s
{
    // ... other members data ...
    struct package_s* next;
} package; //being lazy, I avoid typing struct everywhere...

#define HOWMANY (100)
package* v[HOWMANY];

#define MILES 15
int input_arr[MILES] = {1,3,2,2,1,3,2,1,1,3,2,2,1,2,3};

package*
journey(package* _current_frame, int _start, int _end)
{
    int rpm = (_end > _start) ? (_end-_start) : (_start-_end);
    if (rpm)
        return engine_spin_at_gear(_current_frame, rpm);
    else
        return v[0];
}

package*
ignition_phase(int _batteryS, int _chargedL)
{
    return journey(v[0], _batteryS, _chargedL);
}

这修复了 input_arr 末尾的寻址(也许你想回到零?)

void
transmit_in_order(int*input_arr)
{
    package *v6;
    int i;

    for (i=0; i<MILES-2; i++) {
        v6 = ignition_phase(input_arr[i], input_arr[i+1]);
        printf("%p\n", v6);
    }
}

主要用于可配置数量的v[n],

int main()
{
    int ndx;
    for(ndx=0; ndx<HOWMANY; ++ndx)
    {
        v[ndx] = malloc(sizeof(package));
    }

    for(ndx=0; ndx<HOWMANY; ++ndx)
    {
        v[ndx]->next = v[(ndx+1)%HOWMANY];
        printf("v[%d]=%p\t", ndx, v[ndx]);
    }
    printf("\n", ndx, v[ndx]);

    transmit_in_order(input_arr);
    return 0;
}

关于c++ - 循环列表遍历引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460301/

相关文章:

c - undefined reference '_method'

c - 与我自己的 glibc 链接

java - 高效的树排序

c++ - 如何使用 SSE 优化矩阵 3 乘 3 的点?

c++ - Windows 上 MapViewOfFile 的引用计数问题

c - 在 C 中删除字符串的特定部分

Python,从方法返回/处理复杂数据的最佳方式

复制链表

c++ - 大数字

c++ - 代码库未找到标准 C++ 库 header