Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 5

Удалить элемент с массива указателей по ключу, удалить весь список

21.09.2014, 16:02. Показов 2847. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот моя программа и осталось сделать эти две функции и у меня не выходит
текст программы:
main.cpp
C++ (Qt)
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
#include <QCoreApplication>
#include <malloc.h>
#include <iostream>
#include "type.h"
#include "dop_func.h"
using namespace std;
 
void run_variant(int v);
void addNewEl(void** &start);
 
void** start;
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    while(true){
        cout<<"\n Реализация списка на базе массива указателей\n\n"
           <<"Выберите операцию со списком:\n"
          <<"0.Завершить программу. \n"
         <<"1.Создать список. \n"
        <<"2.Вывести список на экран. \n"
        <<"3.Добавить новый элемент в список. \n"
        <<"4.Удалить элемент по ключу. \n"
        <<"5.Поиск информации по ключу. \n"
        <<"6.Удалить список. \n"
        <<"Ваш выбор: ";
        int v;
        cin>>v;
        run_variant(v);
    }
    return a.exec();
}
 
 
void run_variant(int v){
    switch (v) {
    case 0://завершить программу
        exit(0);
        break;
    case 1: //Создать список
        start=InitArray();
        break;
    case 2://Вывести список на экран
        outputList(start);
        break;
case 3://Добавить элемент в список
        addNewEl(start);
        break;
    case 4://Удалить элемент по ключу
        break;
    case 5://Поиск информации по ключу
        break;
    case 6://Удалить список
        break;
       }
}
 
void addNewEl(void** &start){
    TCount* pnew ; //Указатель на новый элемент
    pnew=new TCount; //Вывод информации о новом элементе
    cout<<"\n Введите информацию о новом элементе:\n"
       <<"Название:   ";
    cin>>pnew->Name;
    cout<<"\n Столица:   ";
    cin>>pnew->Capital;
    cout<<"\n";
    int posFndEl;
    bool findOK;
 
    //Поиск места вставки нового элеента
    FindElList(start, pnew->Name,posFndEl,findOK);
    //Вызов процедуры добавления нового элемента в список
    addToSort(start,pnew,posFndEl);
    //вывод списка на экран
    outputList(start);
 
}
dop_func.cpp:
C++ (Qt)
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "type.h";
#include <iostream>
 
 
void** InitArray ()
{
   /* SIZE_AR_FIRST -  константа, содержащая начальный размер массива*/
 
    void** p=new void* [SIZE_AR_FIRST+2];/* запрашиваем память для  нового массива*/
 
    p=p+2;  /*опускаем указатель вниз на два элемента чтобы он указывал на первый указатель а не на служебный элемент*/
 
 
    ((int*)p)[POS_CNT]  = 0; /*Заполняем служебный элемент массива – количество элементов списка*/
 
    ((int*)p)[POS_SZ]  = SIZE_AR_FIRST; /*Заполняем служебыій элемент массива – размер массива */
    return p;
 
} /*InitArray*/
 
void ExpendArrPtr (void**  &ar,  int &SizeAr, int Cnt)
/*увеличение размера массива указателей*/
/*ar – указатель на массив указателей*/
 
{
  int      SizeW;
  void**   arW; /*вспомогательный бестиповый указатель на начало массива указателей*/
  arW =new void*[SizeAr+2]; /*выделение места для нового массива*/
 
 
  SizeW = SizeAr; /*сохранение старого размера массива*/
  SizeAr = SizeAr + DELTA; /*определение нового размера массива*/
 
  /*копирование старого массива индексов  в новый массив*/
 
  for (int K = SizeAr-1; K >= 0; K--)
  {
  ar[K+1] = ar[K];}
 
  ar=ar-2; // ставим указатель на начало старого массива
 
  delete []ar; //освобождаем память
  ar=arW+2; /* ставим указатель массива на первый указатель в новом массиве */
  ((int*)ar)[POS_CNT]  = Cnt;
  ((int*)ar)[POS_SZ]  = SizeAr;
 
}  /*ExpendArrPtr*/
 
 
void FindElList(void** start,  string key, int &posFndEl, bool &findOK)
{  /* start – указатель на список
      key – ключ поиска
      posFndEl – индекс найденного элемента
      findOk – результат поиска (true – если найден элемент,
               false – если не найден элемент с таким ключом)
   */
 int    middl; /*middl выступает как индекс среднего элемента
              массива*/
 int     hi, low;   /*текущие границы - верхняя, нижняя*/
 findOK = false;     /*элемент не найден*/
 
      /*берем из мссива значение служебного элемента cunt
        И проверяем пуст ли список*/
 
 if (((int*)start)[POS_CNT] == 0)
 {
    posFndEl = 0;
    return;
 }
      /*Устанавливаем границы поиска на границы массива*/
 low = 0;
 hi = ((int*)start)[POS_CNT] - 1;
 
 do
 {
    middl = (hi + low) / 2 ; /*индекс среднего элемента*/
 
     if (key==((TCount*)(start[middl]))->Name)
        { posFndEl = middl; /*Элемент найден*/
        findOK = true;      /*элемент найден*/
        return;
        }
     if (key<((TCount*)(start[middl]))->Name)
        {
          hi = middl - 1;
       }
     else
        {
         low = middl + 1;
       }
 
 } while  (low <= hi);
 posFndEl = low; /*Перебран весь массив. Искомый элемент не найден. Определена позиция возможной вставки нового элемента*/
}   /*FindElList*/
 
 
void addToSort(void** &start,  void* pnew, int posAdd)
{
    /*
         start – указатель на список
         pnew – указатель на новый элемент списка, который размещен
                     в памяти  и поля его заполнены
         posAdd – индекс элемента в массиве, в который необходимо вставить
                         указатель на новый элемент
    */
 
int cnt=((int*)start)[POS_CNT];
int sz= ((int*)start)[POS_SZ];
 
  //если массив переполнен, то вызываем расширение массива
if (cnt == sz)
        {
        ExpendArrPtr (start, sz, cnt);
        }
 
 
 if (posAdd == cnt) //добавляемый элемент располагается в конце списка
        {
        start[posAdd] = pnew;
        }
  else
        {     // сдвиг элементов в массиве указателей на 1 вправо
         for (int k = cnt-1; k >= posAdd; k--)
              {
                  start[k+1] = start[k];}
                  start[posAdd] = pnew;
               }
 cnt++;
 
 ((int*)start)[POS_CNT]=cnt;
} //addToSort
 
 
void outputList(void** start){
    int cnt=((int*)start)[POS_CNT];
    for (int k = 0; k <cnt; k++)
        {
          cout<<((TCount*)start[k])->Name<<"\n";
        }
 }
type.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef TYPE_H
#define TYPE_H
#include <string>
using namespace std;
 
#define DELTA 3
#define POS_CNT -1
#define POS_SZ -2
#define SIZE_AR_FIRST 5
 
typedef struct{
    string Name;
    string Capital;
 
}TCount;
 
#endif // TYPE_H
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2014, 16:02
Ответы с готовыми решениями:

Линейно-однонаправленный список (удалить элемент списка по ключу)
Нужна помощь с методом удаление,должен удалить элемент списка по ключу,поиск приведён. #include &lt;iostream.h&gt; #include...

Удалить элемент массива по ключу
Всем привет. Пробую писать на чистом js, фух не думал что с такими мелочами будет так трудно) Задача: Есть массив объектов: var q = ...

Удалить из массива элемент, стоящий в центре (если количество элементов в массиве чётное, то удалить средние два элемента).
Удалить из массива элемент, стоящий в центре (если количество элементов в массиве чётное, то удалить средние два элемента).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2014, 16:02
Помогаю со студенческими работами здесь

Как вывести весь список, удалить запись и ещё кое чего:)
Здравствуйте На форме есть listbox в котором по запросу выводятся данные из файла (бд, с людьми и характеристиками). 1) Как с помощью...

Дан список ДВУЗНАЧНЫХ чисел произвольной размерности N. Удалить первый элемент массива, в записи которого есть цифра 2
Всем привет. Пожалуйста помогите решить не силен в Python'е. Заранее благодарен. 1.Дан список ДВУЗНАЧНЫХ чисел произвольной...

Удалить k строку и n столбец из двумерного массива с использованием указателей
Нужно удалить k строку и n столбец из двумерного массива с использованием указателей. Перечитал кучу всего, в том числе и на данном форуме,...

Двусвязный список - Добавить элемент после заданного, удалить заданный элемент
Реализуйте списочную структуру в виде класса. работа состоит из двух частей: из класса (структуры, алгоритма) и из тестирующего кода. ...

Односвязный список: удалить элемент списка, если он чётный и следующий элемент отрицательный и нечётный
Здравствуйте. Задание на односвязные списки: удалить элемент списка, если он чётный и следующий элемент отрицательный и нечётный(реализация...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru