我需要在不使用括号的情况下重写此代码。
#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的幂。我可以使用iostream
,cstdio
和stdio.h
库。没有模板。
有谁知道怎么做?
感谢。
答案 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);
}
注意:
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+n
是s1[n]
s1[n].number = a;
s1[n-1].next = (s1+n);