Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
vardog
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 62
#1

Как реализовать создание динамического массива, элементы (узлы) которого являются структурами - C (СИ)

13.04.2013, 01:31. Просмотров 1106. Ответов 6
Метки нет (Все метки)

Не могу понять как реализовать создание динамического массива, элементы(узлы) которого являются структурами.
У меня даны следующие структуры:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//   Объявляем шаблон структуры с полями для каждого узла
struct array_element {
   int element;
   struct array_element * next;
   struct array_element * prev;
};
 
//   Объявляем шаблон структуры с полями для самого массива
struct intarray {
   struct array_element * first;
   struct array_element * last;
   int lowbound;
   int highbound;
   int buffer;
};
typedef struct intarray *intarray;
Не понимаю зачем мне создавать массив(а это требуется в задании), если мне задана структура intarray,узлы которой являются тоже структурами.
Или структура - это тоже массив, только с разными типами?!
В общем не знаю как создать динамический массив используя описанные структуры


Я начал так:
C
1
2
3
 
   intarray fun_number_one_array;
   fun_number_one_array = malloc(sizeof(struct intarray));
Заранее спасибо Всем, кто хоть чем то поможет)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2013, 01:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как реализовать создание динамического массива, элементы (узлы) которого являются структурами (C (СИ)):

Сформировать массив, элементами которого являются элементы исходного массива, расположенные в обратном порядке - C (СИ)
Доброго времини суток. Подскажите пожалуйста как задать массив в массиве

Создание файла, компонентами которого являются целочисленные массивы - C (СИ)
Создать файл F1, компонентами которого являются целочисленные массивы a1,.., a10, закрыть его.

Разработать функцию формирования массива, элементами которого являются цифры числа n - C (СИ)
Дано натуральное число n. Разработать функцию формирования массива, элементами которого являются цифры числа n.

Создание динамического массива строк - C (СИ)
Задача состоит в следующем: из массива строк нужно найти подстроки по заданному условию (например, наличие определенных символов) и...

Правильное создание динамического массива - C (СИ)
Здравствуйте. Хочу чтоб у меня была рабочий код для создания динамического массива. Делал всё по учебному пособию. Матрица забивается и...

Создание динамического двухмерного массива - C (СИ)
Как переписать следующий код на С void allocMatrix(int** &ppMtx, const int nRow, const int nCol) { ppMtx = new int*; for...

6
froOzzy
0 / 0 / 1
Регистрация: 13.04.2013
Сообщений: 13
13.04.2013, 01:53 #2
Вот создания массива структур:
C++
1
2
3
4
5
6
7
8
int A[10]; // Десять элементов и все элементы типа int
 
struct MyStruct
{
int A;
double C[10];
};
MyStruct obj1[10]; //Десять элементов типа MyStruct или массив структур
Cоздание динамического массива структур(выделение памяти)
C++
1
 obj1=new MyStruct[N];
Освобождение памяти
C++
1
2
3
delete []obj1;
//или 
free(obj1);
p.s. в твоих комментариях написано что ты создаешь шаблон структуры,а где там шаблон?
0
vardog
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 62
13.04.2013, 02:11  [ТС] #3
Это описанния структур. Описываются всего лишь поля.

C++
1
2
3
4
5
6
7
8
int A[10]; // Десять элементов и все элементы типа int
 
struct MyStruct
{
int A;
double C[10];
};
MyStruct obj1[10]; //Десять элементов типа MyStruct или массив структур
спасибо, но такие примеры я уже рассматривал.
Тут всего одна структура.

А у меня 2 структуры из которых надо создать двусвязный список.
Я примеры уже многие рассматривал.
Как я понимаю структура intarray - это есть неоднородный массив, а элементы массива соответствуют структуре array_element

Добавлено через 6 минут
если строго то задание звучит так:
"создать динамический массив с нижней границей равной 1" - функция размещает новый динамический массив с нижней границей равной 1 и возвращает указатель на созданный массив.
0
froOzzy
0 / 0 / 1
Регистрация: 13.04.2013
Сообщений: 13
13.04.2013, 07:35 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так бы сразу и сказал что двусвязный список.Для начала немного теории про списки,стеки,очереди:
Кликните здесь для просмотра всего текста

Стек

Стеки широко применяются в системном программном обеспечении, включая компиляторы и интерпретаторы. Компиляторы С++ используют стек для передачи аргументов функциям.
Стеки используют метод доступа, называемый LIFO (last-in, first-out) –элемент, внесенный в стек последним, извлекается из него первым.
В стеке имеются две базовые операции – сохранение и извлечение, которые по традиции называются push и pop соответственно.
В реализации стека необходимы две функции – push (помещающая информацию в стек) и pop (извлекающая информацию из него). Кроме того, для реализации стека потребуется область памяти, которая будет использоваться в качестве стека. Для этой цели можно использовать динамический массив. Функция извлечения удаляет элемент из очереди и уничтожает его содержимое.

Очередь

Очередь представляет собой линейный список, доступ к элементам которого осуществляется по принципу FIFO (first-in, first-out), то есть первый помещенный в очередь элемент будет первым извлечен из нее. Очереди широко применяются при моделировании, диспетчеризации задач операционной системой, буферизации ввода-вывода и т.д.
Основные функции при работе с очередью – qstore() (поместить в очередь) и qretrieve() (извлечь из очереди). Операция извлечения удаляет элемент из очереди, и хранящиеся в этом элементе данные разрушаются. Если из очереди удалить все элементы, она окажется пустой.

Список

Список-это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза. Экземпляр списка является компьютерной реализацией математического понятия конечной последовательности — кортежа. Экземпляры значений, находящихся в списке, называются элементами списка (англ. item, entry либо element); если значение встречается несколько раз, каждое вхождение считается отдельным элементом.

Пример двунаправленного списка:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
class Queue
{
  public:
    int dat;
    Queue *next;
    Queue()
    {
    dat=0;
    next=NULL;
    }
};
class stack :public Queue
{
 
  protected:
    Queue *last;
  public:
    int num;
    stack()
    {
      last=NULL;
      num=0;
    }
    int push(int d)
    {
      Queue *s;
      s=new Queue;
      s->dat=d;
      s->next=last;
      last=s;
      num++;
      return d;
      }
       int pop()
    {
      int d;
      Queue *s;
      s=last;
      d=last->dat;
      last=s->next;
      delete s;
      num--;
      return d;
    }
};
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int n,r;
 n=StrToInt(Edit4->Text);
 StringGrid1->ColCount=n;
  StringGrid2->ColCount=n;
   StringGrid3->ColCount=n;
 stack s;
 int res,set;
 for(int i=0;i<StringGrid1->ColCount;i++)
 {for(int j=0;j<StringGrid1->RowCount;j++)
 {
 StringGrid1->Cells[i][j]="";
 StringGrid2->Cells[i][j]="";
 StringGrid3->Cells[i][j]="";
 }
 }
 for(int i=0;i<n;i++)
 {
 res=random(10);
 s.push(res);
 StringGrid1->Cells[i][0]=IntToStr(s.push(res));
 }
 for(int i=0;i<n;i++)
 {set=s.pop();
 if(set%2==0)
 {
 StringGrid2->Cells[i][0]=IntToStr(s.pop());
 }
 else
 {StringGrid3->Cells[i][0]=IntToStr(s.pop());}
 }
 
 }
//---------------------------------------------------------------------------

Двусвязный список:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdlib.h>
#include <iostream.h>
 
struct Node       //Структура являющаяся звеном списка
 {
     int x;     //Значение x будет передаваться в список
     Node *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
 };
 
 class List   //Создаем тип данных Список
 {
     Node *Head,*Tail; //Указатели на адреса начала списка и его конца
 public:
     List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
     ~List(); //Деструктор
     void Show(); //Функция отображения списка на экране
     void Add(int x); //Функция добавления элементов в список
 };
 
List::~List() //Деструктор
 {   
     while (Head) //Пока по адресу на начало списка что-то есть
     {
         Tail=Head->Next; //Резервная копия адреса следующего звена списка
         delete Head; //Очистка памяти от первого звена
         Head=Tail; //Смена адреса начала на адрес следующего элемента
     }
 }
 
 void List::Add(int x)
 {
   Node *temp=new Node; //Выделение памяти под новый элемент структуры
   temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
   temp->x=x;//Записываем значение в структуру
 
   if (Head!=NULL) //Если список не пуст
   {
       temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
       Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
       Tail=temp; //Меняем адрес хвоста
   }
   else //Если список пустой
   {
       temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
       Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
   }
 }
 
 void List::Show()
 {
//ВЫВОДИМ СПИСОК С КОНЦА
     Node *temp=Tail;
      //Временный указатель на адрес последнего элемента
     while (temp!=NULL) //Пока не встретится пустое значение
     {
     cout<<temp->x<<" "; //Выводить значение на экран
     temp=temp->Prev; //Указываем, что нужен адрес предыдущего элемента
     }
     cout<<"\n";
 
 //ВЫВОДИМ СПИСОК С НАЧАЛА
     temp=Head; //Временно указываем на адрес первого элемента
      while (temp!=NULL) //Пока не встретим пустое значение
     {
     cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
     temp=temp->Next; //Смена адреса на адрес следующего элемента
     }
     cout<<"\n";
 }
 
int main ()
{
 system("CLS");
 List lst; //Объявляем переменную, тип которой есть список
 lst.Add(100); //Добавляем в список элементы
 lst.Add(200);
 lst.Add(900);
 lst.Add(888);
 
 lst.Show(); //Отображаем список на экране
  system("PAUSE");
}
0
vardog
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 62
13.04.2013, 11:52  [ТС] #5
Я C++ непонимаю.
Пример со структурой Node я уже не раз рассматривал.
У меня в задании зачем то 2 структуры данных!

Структура array_element - для узла
Структура intarray - ?

Хотябы просто скажите кто знает intarray структура данных для самого списка да?
Получается список - это и есть массив?
Напишу как нибудь уж, просто не понимаю почему в примерах везде одна структура, а у меня в задании их две.

Добавлено через 15 минут
Просто C++ не понимаю еще классы и объекты.
В примере походу
C++
1
class List
- это как у меня структура intarray
Тоесть список - это и есть массив получается., если я правильно понял
0
kotleta
42 / 42 / 11
Регистрация: 13.09.2012
Сообщений: 196
13.04.2013, 11:56 #6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
struct list
{
 int info;
 struct list* next;
};
 
int main()
{
 int i,j;
 struct list* lists;
 
 scanf("%d",&i);
 
 lists = (struct list*)malloc(sizeof(struct list)*1);
 scanf("%d",&lists->info);
 
 for(j=0; j < i-1; j++)
 {
  lists->next=(struct list*)malloc(sizeof(struct list)*1);
  scanf("%d",&lists->next->info);
  lists=lists->next;
 }
 
 free(lists);
 
 return 0;
}
например вот так, хотя нужно еще дорабатывать, ну я думаю, разебетесь
1
vardog
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 62
13.04.2013, 15:58  [ТС] #7
Это получается односвязный список.
До двусвязного я думаю доделаю.
Просто укажу указатель на предыдущий узел еще.
Здесь опять одна структура только для самого узла.

Вопрос у меня по прежнему остается:

Хотябы просто скажите кто знает intarray структура данных для самого списка да?
Получается список - это и есть массив?
Не понимаю почему в примерах везде одна структура, а у меня в задании их две.
Добавлено через 3 часа 54 минуты
А еще вопрос к тем кто знает, typedef это как бы просто для удобство сделаллнно да?
чтобы я объявлял не так:
C
1
struct intarray *p;
а сокращенно:
C
1
intarray p;
Правильно я понимаю?
0
13.04.2013, 15:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2013, 15:58
Привет! Вот еще темы с ответами:

Создание динамического многомерного массива - C (СИ)
Правильно ли я создаю динамический массив . Кусок кода ... //------------------------------------- int stolb,strok ,i,i1,i2; ...

Создание динамического массива структур - C (СИ)
Нужно создать структуру с тремя переменными char int int С динамическим увеличением памяти для задавания их через scanf(&quot;%c...

Создание динамического массива в функции - C (СИ)
Что - то я не сильно догоняю. void create_matrix( int ***array, int N, int M ) { int i; *array = ( int** )calloc( N,...

Создание двумерного динамического массива в функции - C (СИ)
Здравствуйте. Помогите мне пожалуйста. При создании двумерного динамического массива через функцию выдает ошибку. Но если писать все в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru