Динамическое распределение памяти без скобок

Мне нужно переписать этот код без использования скобок.

#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 но я не знаю этот номер. В упражнении написано: совершенно случайное количество, значение числа которого не больше 2 в степени 31. Я могу использовать iostream, cstdio а также stdio.h библиотеки. Нет шаблонов.

У кого-нибудь есть идеи как это сделать?

Благодарю.

-9

Решение

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

Является linked list

Таким образом, нет необходимости записывать это как случайную память.

учить больше Связанный список

Поскольку это домашнее задание, сделайте это самостоятельно

4

Другие решения

Я был убежден (виноват Lounge<C ++>) опубликовать ответ, который (по крайней мере, своего рода) отвечает на заданный вопрос (как написать код без скобок), даже если он явно не соответствует действительности.

??=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());
??>

При этом вы можете написать свой код обычным образом (используя скобки там, где считаете нужным), а затем запустить его через эту программу (которая работает как фильтр), чтобы преобразовать все скобки в их форму триграфа, чтобы исходный код не включал никаких скобок ( или брекеты). Уродство, которое вы видите выше, является результатом того, что он был запущен в своем собственном исходном коде, таким образом устраняя все скобки и скобки.

Для тех, кто занимается уловками языка-юриста, обратите внимание на то, как я указал строки, содержащие последовательности триграфа. Чтобы поддерживать их как строки из трех символов, каждый записывается как пара смежных строковых литералов. Последовательности триграфа заменяются в фазе 1 перевода, но смежные строковые литералы не соединяются до фазы 6, поэтому последовательности триграфа не создаются до тех пор, пока не произойдет замена триграфа.

Примечание по компиляции: VC ++ и g ++ по умолчанию отключают подстановку триграфа. Чтобы скомпилировать это с теми, вам нужно указать --trigraph с g ++ и /Zc:trigraph с VC ++.

Что касается первоначально заданного вопроса: вы обычно строите связанный список, выделяя узлы в связанном списке индивидуально. Поскольку вы указали 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 выделить каждый узел. Для производственного кода вы действительно этого не хотите, но для «правильных» подходов потребуется либо написать весь код для умного указателя самостоятельно, либо нарушить ограничения на то, какие заголовки можно использовать. По-видимому, это также может нарушить ожидания вашего профессора.
38

Вы можете сделать указатель на свою структуру, а затем выделить память для 100 элемент:

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

Вам не нужно писать &(s1[n]) получить адрес s1[n], По указателям арифметики s1+n это адрес s1[n]

    s1[n].number = a;
s1[n-1].next = (s1+n);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector