2014-02-11 2 views
1

Я создал программу диспетчера памяти, которая использует узлы в связанном списке, которые хранят номер задания узла и начальный и конечный байт памяти, используемой узлом.Функция отчета со списком связанных с C++

У меня возникли проблемы с мыслью о способе сделать мою работу report_jobs. Я хотел бы выход выглядеть как этот

JOB   Memory Usage 

1   10 – 50 54 – 75 200 – 240 
5   1 – 9 101 – 134 
3   180 – 184 185 – 192 

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

Вот пример кода, с которым я возился, im позитивный я уже усложняю вещи, и мне просто нужно увидеть его более простым способом.

void report_jobs(void) 
{ 
    ALLOCPTR t = alloclist; 
    ALLOCPTR m = alloclist; 
    int numberofnodes = 0; 
    int job = 0; 

while(m!=NULL) 
{ 
jobb++; 

    while(t!=NULL) 
    { 
      if(t->id == job) 
      { 
       cout << t->id << t-> start_byte << t-> end_byte << endl; 

      } 
      t = t->next; 


    } 


    m = m->next 

} 
+0

Почему бы не поставить эти данные в dict и output – michaeltang

+0

Это не совсем тривиально. Вам необходимо агрегировать (отсортированные?) Диапазоны адресов в отношении ваших заданий. Вам понадобятся некоторые вещи под капотом, чтобы это хорошо работало, в зависимости от ожидаемых случаев использования. Например, если у вас есть минимальная привязка к идентификаторам работы, с которыми вам нужно работать, вы можете создать структуру, содержащую начальный и конечный байты, и создать упорядоченный длинный вектор связанных списков этой структуры для организации данных. Если идентификаторы работы сходят с ума, вы можете использовать хэш связанных списков структуры. –

ответ

1

Возможно, что вы хотите сделать нам использовать хэш-таблицы или таблицы индекса с ключом по ид задания и заполнить эту запись с информацией начала и конца байта, как вы итерацию над списком.

Затем выполните другой проход по таблице, чтобы сгенерировать выходной сигнал.

for (i in alloclist) { 
    table[i->id].populate(i->start_byte, i->end_byte); 
} 

for (j in table) { 
    std::cout << table[j]; 
} 
Смежные вопросы