Контейнер типа динамический массив(вектор). Язык- Чистый Си
В прошлой теме человек мне ответил что динамический массив можно задать структурой:
Код:
struct din_arr{
char s;
struct din_arr *next;
}
char s;
struct din_arr *next;
}
И сказал что под каждый новый элемент нужно выделять память через malloc. Я так и не понял как это сделать. Как в интернете вычитал массив хранит сами элементы а не указатели на них, тем и отличается от списка. Вот и не понимаю как это реализовать.
Тебе нужен массив или вектор? Если массив, то какой? Динамический? Если вектор, то структура, которая у тебя есть, подходит.
Ну преподаватель написал в задании цитирую "динамический массив(вектор)". Вот у меня и путаница, сейчас не могу найти точку отправления.
Вектор - это список с произвольным методом доступа. Та структура, что у тебя есть, подходит. Почитай про этот контейнер, про его методы push_back, at, size,[]. Реализовывать его можно, как обычный динамический список.
спасибо))
Код:
#include "stdafx.h"
const int STR_LEN = 50; //максимальная длина строки
const int FN_LEN = 24; //максимальная длина имени файла
const int DIR = 1; //прямое направление отображения
const int BACK = -1; //обратное направление отображения
struct item
{
char* key;
item* next;
};
void AddItem(item*&, char*);
item* CopyList(item*);
int DeleteItem(item*&, item*&);
int FindItem(item*, item*&, char*);
void PrintList(item*, int);
void DeleteDblItems(item*);
int CountItems(item*);
void SortList(item*&);
item* LinkLists(item*, item*);
item* SubtrLists(item*, item*);
item* CrossLists(item*, item*);
int SaveList(item*, FILE*);
int OpenList(item*&, FILE*);
void Menu1();
void Menu2(item*&);
void Menu3(item*&, item*&);
int _tmain(int argc, _TCHAR* argv[])
{
Menu1();
return(0);
}
void DeleteList(item*& pFirst)
//Удаление всего списка
{
while (pFirst != 0)
DeleteItem(pFirst, pFirst);
}
void AddItem(item*& pFirst, char* Str)
//Добавление в начало списка нового элемента
{
item* P = new item;
P->key = new char[strlen(Str)];
strcpy(P->key, Str);
P->next = pFirst;
pFirst = P;
}
...
const int STR_LEN = 50; //максимальная длина строки
const int FN_LEN = 24; //максимальная длина имени файла
const int DIR = 1; //прямое направление отображения
const int BACK = -1; //обратное направление отображения
struct item
{
char* key;
item* next;
};
void AddItem(item*&, char*);
item* CopyList(item*);
int DeleteItem(item*&, item*&);
int FindItem(item*, item*&, char*);
void PrintList(item*, int);
void DeleteDblItems(item*);
int CountItems(item*);
void SortList(item*&);
item* LinkLists(item*, item*);
item* SubtrLists(item*, item*);
item* CrossLists(item*, item*);
int SaveList(item*, FILE*);
int OpenList(item*&, FILE*);
void Menu1();
void Menu2(item*&);
void Menu3(item*&, item*&);
int _tmain(int argc, _TCHAR* argv[])
{
Menu1();
return(0);
}
void DeleteList(item*& pFirst)
//Удаление всего списка
{
while (pFirst != 0)
DeleteItem(pFirst, pFirst);
}
void AddItem(item*& pFirst, char* Str)
//Добавление в начало списка нового элемента
{
item* P = new item;
P->key = new char[strlen(Str)];
strcpy(P->key, Str);
P->next = pFirst;
pFirst = P;
}
...
Что тогда требуется доработать?
Цитата:
Что тогда требуется доработать?
Если твой список умеет удалять элемент с определённой позиции, добавлять в определённую позицию, добавлять перед первым, добавлять за последним, возвращать количество элементов в списке и возвращать значение из определённой позиции, не удаляя элемент, то ничего дорабатывать не нужно.