Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Контейнер типа динамический массив(вектор). Язык- Чистый Си

77K
18 марта 2012 года
brembo
7 / / 14.03.2012
Задавал уже этот вопрос, но так и не смог разобраться. Как на чистом Cи реализовать контейнер типа динамический массив (вектор) содержащий строки произвольной длины?? Вопрос в создании и его удалении, добавлении элементов и итераторе.
В прошлой теме человек мне ответил что динамический массив можно задать структурой:
 
Код:
struct din_arr{
    char s;
    struct din_arr *next;
}

И сказал что под каждый новый элемент нужно выделять память через malloc. Я так и не понял как это сделать. Как в интернете вычитал массив хранит сами элементы а не указатели на них, тем и отличается от списка. Вот и не понимаю как это реализовать.
316
18 марта 2012 года
Alm3n
889 / / 29.05.2009
Тебе нужен массив или вектор? Если массив, то какой? Динамический? Если вектор, то структура, которая у тебя есть, подходит.
77K
18 марта 2012 года
brembo
7 / / 14.03.2012
Ну преподаватель написал в задании цитирую "динамический массив(вектор)". Вот у меня и путаница, сейчас не могу найти точку отправления.
316
18 марта 2012 года
Alm3n
889 / / 29.05.2009
Вектор - это список с произвольным методом доступа. Та структура, что у тебя есть, подходит. Почитай про этот контейнер, про его методы push_back, at, size,[]. Реализовывать его можно, как обычный динамический список.
81K
18 марта 2012 года
mankuny
1 / / 18.03.2012
спасибо))
77K
18 марта 2012 года
brembo
7 / / 14.03.2012
т.е за основу могу спокойно брать, тотже линейный-односвязный допустим?

Код:
#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;
}
...

Что тогда требуется доработать?
316
18 марта 2012 года
Alm3n
889 / / 29.05.2009
Да, а почему нет? Если сравнить методы списка, вектора и массива, то схожи они в том, что имеют произвольный доступ к элементам. От остальных структур, таких, как очередь или стек, первые три отличаются методом доступа к элементам. У стека это FIFO, у очереди - FILO.
Цитата:
Что тогда требуется доработать?


Если твой список умеет удалять элемент с определённой позиции, добавлять в определённую позицию, добавлять перед первым, добавлять за последним, возвращать количество элементов в списке и возвращать значение из определённой позиции, не удаляя элемент, то ничего дорабатывать не нужно.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог