没有括号的动态内存分配

时间:2013-12-30 05:46:54

标签: c++

我需要在不使用括号的情况下重写此代码。

#include <iostream>

using namespace std;

struct struct_set
{
    unsigned long long number;
    struct_set *next;
};

int main()
{
    struct_set s1[100];
    int a,n=1;
    cin >> a;
    s1[0].number = a;
    s1[0].next = NULL;
    cin >> a;
    while(a!=0)
    {
        s1[n].number = a;
        s1[n-1].next = &(s1[n]);
        cin >> a;
        ++n;
    }
    for(int i = 0; i < n; ++i)
    {
        cout << s1[i].number << " ";
    }
    return 0;
}

我将数组s1的大小设置为但我不知道这个数字。在练习中写道:完全随机的数量,其数值不超过31的幂。我可以使用iostreamcstdiostdio.h库。没有模板。

有谁知道怎么做?

感谢。

3 个答案:

答案 0 :(得分:38)

我已被说服(责备休息室&lt; C ++&gt;)发布一个答案(至少有点)回答问题(如何编写没有括号的代码),即使它清楚错过了真正的观点。

??=include <map>
??=include <string>
??=include <algorithm>
??=include <iostream>
??=include <iterator>
??=include <limits.h>

class xlat ??<
    std::map<char, std::string> table;
public:
    xlat() ??<
        for (int i = 0; i < UCHAR_MAX; i++)
            table??(i??) = i;
        table??('??='??) = "??" "=";
        table??('??/??/'??) = "??" "/";
        table??('??''??) = "??" "'";
        table??('??('??) = "??" "(";
        table??('??)'??) = "??" ")";
        table??('??!'??) = "??" "!";
        table??('??<'??) = "??" "<";
        table??('??>'??) = "??" ">";
        table??('??-'??) = "??" "-";
    ??>
    std::string operator()(unsigned char in) ??< return table??(in??); ??>
??>;

int main() ??<
    std::cin >> std::noskipws;
    std::transform(std::istream_iterator<char>(std::cin),
        std::istream_iterator<char>(),
        std::ostream_iterator<std::string>(std::cout),
        xlat());
??>

有了这个,您可以正常编写代码(使用您认为合适的括号)然后通过此程序(用作过滤器)运行它以将所有括号转换为它们的三字形形式,因此源代码将不包括任何括号(或括号)。您在上面看到的丑陋是它在自己的源代码上运行的结果,从而消除了所有括号和括号。

对于任何进入语言律师技巧的人,请注意我是如何指定包含三字符序列的字符串的。要将它们保存为三个字符的字符串,每个字符都写为一对相邻的字符串文字。 Trigraph序列在翻译的第1阶段被替换,但相邻的字符串文字在第6阶段之前不会连接,因此三元组序列直到发生三元组替换后才会生成。

关于编译的注意事项:默认情况下,VC ++和g ++都禁用三字符替换。要使用这些编译它,您需要使用g ++指定--trigraph,使用VC ++指定/Zc:trigraph

关于最初提出的问题:您通常通过分别在链接列表中分配节点来构建链接列表。既然你已经指定了C ++并且你的限制似乎没有消除new的使用,那么你可能想要使用它。例如,让我们构建一些数字的链表,然后打印出链表的内容:

struct node {
    unsigned long long number;
    node *next;
    node(unsigned long long n, node *next=nullptr) : number(n), next(next) {}
};

void destroy(node *root) {
    if (root==nullptr)
        return;
    destroy(root->next);
    delete root;
}

int main() {
    node *root = nullptr;

    // build the linked list:
    for (int i=0; i<20; i++)
        root = new node(i, root);        

    // print it out:
    for (node *temp = root; temp; temp = temp->next)
        std::cout << temp -> number << "\n";

    // destroy it:
    destroy(root);
}

注意:

  1. 此源代码缺少括号(即使不使用前面的怪物)。
  2. 这使用“原始”new来分配每个节点。对于生产代码,你真的不希望这样,但“正确”的方法需要自己编写智能指针的所有代码,否则就会违反对可以使用的标头的限制。据猜测,它可能也会违反教授的期望。

答案 1 :(得分:4)

struct struct_set
{
    unsigned long long number;
    struct_set *next;
};

linked list

所以没有必要把它写成连续的记忆。

了解详情Linked list

因为这是家庭作业自己做的

答案 2 :(得分:0)

您可以创建指向您的结构的指针,然后为100元素分配内存:

struct struct_set *s1;
s1 = (struct_set *)malloc(100*sizeof(struct_set));

您不需要撰写&(s1[n])来获取s1[n]的地址。根据指针arithmitics s1+ns1[n]

的地址
    s1[n].number = a;
    s1[n-1].next = (s1+n);