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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.78
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
#1

Указатели на структуры - C++

06.11.2010, 18:20. Просмотров 7950. Ответов 104
Метки нет (Все метки)

Pascal
1
2
3
4
5
type  celltype = record 
elетеt: integer; 
next: ^celltype 
end; 
DICTIONARY = array[0..B-1]  of  ^celltype;
какой аналог этой записи будет на си?
C++
1
2
3
4
5
6
7
typedef struct spis
{
    char *s;
    spis *next;
};
 
typedef struct spis *dict[maxn];
такой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2010, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели на структуры (C++):

Указатели на структуры - C++
Подскажите в чем ошибка...Дело в том когда я в вожу в каждое поле по 1 значению все нормально выводит,но если при в вводе в поле я пишу два...

Указатели и структуры - C++
Здравия желаю. Подскажите пожалуйста каким образом осуществляется доступ к полю структуры, если оно является указателем?

Структуры и указатели - C++
Задался парой вопросов. Возможно, уже где-то задавались, поэтому прошу прощения заранее. Ниже описана структура для однонаправленного...

Указатели и структуры - C++
Здравствуйте. Подскажите, пожалуйста, почему не меня среда ругается. error C2440: =: невозможно преобразовать "Book *" в...

Структуры и указатели - C++
Привет форумчане, столкнулся вот с такой вот задачкой на структуры: 1. Описать структуру с именем PRICE, содержащую следующие поля: -...

Структуры и указатели на структуры - C++
Так ли я сделал? #include <iostream> struct S { int i; }; void f1(S*s1,int k=0){ s1->i=k;};

104
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.11.2010, 23:35  [ТС] #16
Цитата Сообщение от accept Посмотреть сообщение
ты передаёшь строку, потом у неё внутри функции считаешь длину, выделяешь память под эту длину (плюс один для нуль-символа), потом записываешь эту строку в эту память strcpy(), потом эту память сохраняешь в узел
потом, в конце работы с таблицей или узлом, память из под строки освобождаешь
т.е

C++
1
2
3
4
5
6
7
8
9
char *x1=new char[strlen(x)];
       strcpy(x1,x);
       .................
       if ...........
      {
        ......
          k[symb]->val=x1;
      }
     delete [] x1;
так?
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 00:54 #17
отступы опять (отступы должны быть везде одинаковые по длине)

C++
1
    char *x1 = new char[strlen(x) + 1];
delete делаешь только когда поработал с таблицей

вот здесь следи за отступами
C++
1
2
3
4
5
6
7
8
9
    char *x1 = new char[strlen(x)]; // один отступ, длина четыре
 
    strcpy(x1, x); // один отступ, длина четыре
    
    if (условие) { // один отступ, длина четыре
        k[symb]->val = x1; // два отступа, длина четыре
    } // один отступ, длина четыре
    
    delete [] x1; // один отступ, длина четыре
операторы, идущие друг за другом, имеют одно и то же количество отступов

вот ты вставляешь ещё действий в условие if
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    char *x1 = new char[strlen(x)]; // один отступ, длина четыре
 
    strcpy(x1, x); // один отступ, длина четыре
    
    if (условие) { // один отступ, длина четыре
        k[symb]->val = x1; // два отступа, длина четыре
        cout << x1 << endl; // два отступа, длина четыре
        if (условие) { // два отступа, длина четыре
            действие; // три отступа, длина четыре
            действие; // три отступа, длина четыре
        } // два отступа, длина четыре
    } // один отступ, длина четыре
    
    delete [] x1; // один отступ, длина четыре
1
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 01:01  [ТС] #18
на visual studio придется перейти.там автоматически отступы ставятся

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
delete делаешь только когда поработал с таблицей
то есть в функцию del его запихать?

Добавлено через 1 минуту
код все равно не работает.вылетае с ошибкой
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.11.2010, 01:02 #19
Artishok, почти во всех вменяемых IDE имеются автоотступы.
0
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 01:03  [ТС] #20
в блокноте нет
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 01:19 #21
если блокнот в уиндоус

Добавлено через 1 минуту
Цитата Сообщение от Artishok
то есть в функцию del его запихать?
код все равно не работает.вылетае с ошибкой
если она узел удаляет, то можно там при удалении узла делать delete []
а в каком он сейчас состоянии, в том же самом ?
0
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 01:43  [ТС] #22
в таком

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
#include <iostream>
 
 struct spis //ýëåìåГ*ГІ õåø-ГІГ*áëèöû óçåë Г±ГЇГЁГ±ГЄГ*
 {
    char *val;
    struct spis *next;
};
 
typedef struct spis *dictionary[10];//ГЄГ*æäîå dictionary[i]-ðåçóëüòГ*ГІ õåø-ГґГіГ*êöèè
 
 
int ord(char o)//ïåðåâîä ñèìâîëГ* Гў êîä
{
 return (unsigned char) o;
}
 
int hash (char *x)//õåø-ГґГіГ*êöèÿ
{
 int i,sum=0;
 for(i=0;i<10;i++)
    sum+=ord(x[i]);//ñóììèðóåì êîäû ñèìâîëîâ
  return sum%10; 
}
 
void makenull(dictionary k)//îáГ*óëåГ*ГЁГҐ õåø-ГІГ*áëèöû
{
    for(int i=0;i<10;i++)
    k[i]=0;
}
 
bool member(char *x,dictionary k)//ïðîâåðêГ* Г*Г* Г*Г*ëè÷èå
{
    spis *cur;
    cur=k[hash(x)];//Г*Г*Г·Г*ëüГ*îå Г§Г*Г*Г·ГҐГ*ГЁГҐ Г°Г*ГўГ*Г® Г§Г*ãîëîâêó ñåãìåГ*ГІГ* êîòîðîìó ïðèГ*Г*äëåæèò x
    while (cur!=0)//ïîêГ* Г*ГҐ äîéäåò äî ГЄГ®Г*Г¶Г* 
    {
        if (cur->val==x)//åñëè ГҐГ±ГІГј
         return true;//Г§Г*Г*Г·ГЁГІ ГҐГ±ГІГј
        else //ГЁГ*Г*Г·ГҐ
         cur=cur->next;//ïåðåìåùГ*ГІГјГ±Гї
    }
    return false;
}
 
void insert(char *x,dictionary k)//ГўГІГ*ГўГЄГ*
{
    
    int symb;//Г*îìåð ñåãìåГ*ГІГ*
    spis *oldhead;
    char *x1=new char[strlen(x)+1];
    strcpy(x1,x);
    if (!member(x1,k)) //åñëè Г*ГҐГІ ГІГ®
    {
        symb=hash(x1);//ñîçäГ*ГҐГ¬ êîä äëÿ ñòðîêè
        oldhead=k[symb]; //Г±ГІГ*ðîé ãîëîâå ïðèñâîèòü Г§Г*Г*Г·ГҐГ*ГЁГҐ k-õåøåâñêîãî
        k[symb]=new spis; //Г*îâûé ýëåìåГ*ГІ ГІГЁГЇГ* spis c êîäîì symb
        k[symb]->val=x1; //Г§Г*ГЇГЁГ±Г*ГІГј Г§Г*Г*Г·ГҐГ*ГЁГҐ
        k[symb]->next=oldhead; //ГіГЄГ*Г§Г*òåëü Г*Г* ñëåäóþùèé ýëåìåГ*ГІ ñäåëГ*ГІГј Г*Г* Г±ГІГ*ðóþ ãîëîâó
    }
}
 
void del(char *x,dictionary k) //ГіГ¤Г*ëåГ*ГЁГҐ
{
    int symb;//äëÿ õðГ*Г*ГҐГ*ГЁГї êîäГ* 
    spis *cur;//ГіГЄГ*Г§Г*òåëü Г*Г* ýëåìåГ*ГІГ* ГІГЁГЇГ* spis
    symb=hash(x);//ïîëó÷Г*ГҐГ¬ êîä äëÿ òîãî Г·ГІГ® õîòèì ГіГ¤Г*ëèòü
    bool f=true;
    if (k[symb]!=0)//åñëè ГІГ® Г·ГІГ® ïîëó÷åГ*Г® Г*ГҐ Г*îëü
    {
        if (k[symb]->val==x) //åñëè ñëó÷èëîñü Г·ГІГ® ýëåìåГ*ГІ ГіГ¤Г*ëÿåìûé ãîëîâГ*
          k[symb]=k[symb]->next; //ãîëîâîé Г±ГІГ*Г« áûâøèé next
          else //ГЁГ*Г*Г·ГҐ
          {
            cur=k[symb];//ïðèñâîèì Г§Г*Г*Г·ГҐГ*ГЁГҐ ýëåìåГ*ГІГ* Г± êîäîì symb
            while((cur->next!=0)&&(f))//ïîêГ* ГЇГ® ýòîìó êîäó ГЇГ® Г±ГЇГЁГ±ГЄГі Г*ГҐ äîéäåò ïîñëåäГ*ГҐГЈГ® èëè Г*ГҐ Г*Г*éäåò
             if (cur->next->val==x)//åñëè ýëåìåГ*ГІ ñëåäóþùèé èìååò ГЅГІГ® Г§Г*Г*Г·ГҐГ*ГЁГҐ ГІГ®
             {
                cur->next=cur->next->next;//ýëåìåГ*ГІ ïðåä ГіГЄГ*çûâГ*ГҐГІ óæå Г*ГҐ Г*Г* Г*ГҐГЈГ® Г*Г* Г§Г* ñëåäóþùèé Г§Г* Г*ГЁГ¬
                f=false;//öèêë Г§Г*âåðøåГ*
             }
             else
             cur=cur->next;//ÏåðåìåùГ*åìñÿ ГЇГ® Г±ГЇГЁГ±ГЄГі
          }
    }
}
 
int main()
{
   dictionary d;
   char *s;
   cin>>s;
   insert(s,d);
   makenull(d);
}
Добавлено через 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
30
void del(char *x,dictionary k) //ГіГ¤Г*ëåГ*ГЁГҐ
{
    int symb;//äëÿ õðГ*Г*ГҐГ*ГЁГї êîäГ* 
    spis *cur;//ГіГЄГ*Г§Г*òåëü Г*Г* ýëåìåГ*ГІГ* ГІГЁГЇГ* spis
    symb=hash(x);//ïîëó÷Г*ГҐГ¬ êîä äëÿ òîãî Г·ГІГ® õîòèì ГіГ¤Г*ëèòü
    bool f=true;
    if (k[symb]!=0)//åñëè ГІГ® Г·ГІГ® ïîëó÷åГ*Г® Г*ГҐ Г*îëü
    {
        if (k[symb]->val==x)
         { //åñëè ñëó÷èëîñü Г·ГІГ® ýëåìåГ*ГІ ГіГ¤Г*ëÿåìûé ãîëîâГ*
          spis *chuck=k[symb];//äîïîëГ*èòåëüГ*îé ïåðåìåГ*Г*îé Г§Г*Г*Г·ГҐГ*ГЁГҐ "ГЎГ*ГёГ*ГЁ"
          k[symb]=k[symb]->next; //ãîëîâîé Г±ГІГ*Г« áûâøèé next
          delete chuck;//ГіГ¤Г*ëåÿì ГЁГ§ ГЇГ*ìÿòè
         }
          else //ГЁГ*Г*Г·ГҐ
          {
            cur=k[symb];//ïðèñâîèì Г§Г*Г*Г·ГҐГ*ГЁГҐ ýëåìåГ*ГІГ* Г± êîäîì symb
            while((cur->next!=0)&&(f))//ïîêГ* ГЇГ® ýòîìó êîäó ГЇГ® Г±ГЇГЁГ±ГЄГі Г*ГҐ äîéäåò ïîñëåäГ*ГҐГЈГ® èëè Г*ГҐ Г*Г*éäåò
             if (cur->next->val==x)//åñëè ýëåìåГ*ГІ ñëåäóþùèé èìååò ГЅГІГ® Г§Г*Г*Г·ГҐГ*ГЁГҐ ГІГ®
             {
                spis *chuck=cur->next;//ïðèñâГ*ГЁГўГ*ГҐГ¬ ïåðåìåГ*Г*îé Г§Г*Г*Г·ГҐГ*ГЁГї òîãî êîãî õîòèì ГіГ¤Г*ëèòü
                cur->next=cur->next->next;//ýëåìåГ*ГІ ïðåä ГіГЄГ*çûâГ*ГҐГІ óæå Г*ГҐ Г*Г* Г*ГҐГЈГ® Г*Г* Г§Г* ñëåäóþùèé Г§Г* Г*ГЁГ¬
                delete chuck;
                f=false;//öèêë Г§Г*âåðøåГ*
             }
             else
             cur=cur->next;//ÏåðåìåùГ*åìñÿ ГЇГ® Г±ГЇГЁГ±ГЄГі
          }
    }
}
немного имзенил delete

я кстати отсутпы ставлю более-менее нормально.это при копировании они смещаются
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 01:58 #23
C++
1
2
3
    char *x1=new char[strlen(x)+1];
    strcpy(x1,x);
    if (!member(x1,k))
утечка памяти
а если оно member ? память осталась выделенной

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

C++
1
2
3
    char *s;
    cin >> s;
    insert(s, d);
в s нельзя писать, потому что он никуда не указывает, сначала нужно создать буфер, потом установить s на него, а потом уже писать в s (он будет перенаправлять данные в буфер)
0
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 02:02  [ТС] #24
Цитата Сообщение от accept Посмотреть сообщение
а если оно member ? память осталась выделенной
ну можно добавить else с очисткой памяти

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
должно быть два освобождения памяти, первое освобождает память из под строки, а второе - из под узла (ты сделал из под узлов, но их строки остались болтаться)
так из узла и удаляется.
а в функции makenull таблица обнуляется.
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 02:02 #25
Цитата Сообщение от Artishok
ну можно добавить else с очисткой памяти
а зачем выделять память, если она не понадобится ?

Цитата Сообщение от Artishok
так из узла и удаляется.
нет, нужно сделать сначала delete [] chuck->val; потому что она не освобождается сама
0
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 02:06  [ТС] #26
Цитата Сообщение от accept Посмотреть сообщение
сначала delete [] chuck.val
а потом delete chuck

Цитата Сообщение от accept Посмотреть сообщение
а зачем выделять память, если она не понадобится ?
так нужна эта строка или нет?
C++
1
char *x1=new char[strlen(x)+1];
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 02:12 #27
Цитата Сообщение от Artishok
я кстати отсутпы ставлю более-менее нормально.это при копировании они смещаются
потому что их надо делать пробелами, так как в разных программах табуляции могут по-разному показываться, где-то они занимают немного, а где-то чуть-ли не полстраницы

Добавлено через 15 секунд
Цитата Сообщение от Artishok
я кстати отсутпы ставлю более-менее нормально.это при копировании они смещаются
потому что их надо делать пробелами, так как в разных программах табуляции могут по-разному показываться, где-то они занимают немного, а где-то чуть-ли не полстраницы

Добавлено через 2 минуты
Цитата Сообщение от Artishok Посмотреть сообщение
а потом delete chuck

так нужна эта строка или нет?
C++
1
char *x1=new char[strlen(x)+1];
да, перед delete chuck делаешь delete [] chuck->val

эта строка должна быть там, где пошло создание узла, где уже ясно, что узел будет создан
поэтому проверку нужно делать не с x1, а прямо с x, а потом уже внутри условного оператора выделять память и для строки и для узла
1
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 12:19  [ТС] #28
ладно.завтра доделаю.
надеюсь что хоть работать будет.во вторник сдавать.

Добавлено через 10 часов 0 минут
не пашет после всех исправлений

Добавлено через 53 секунды
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
#include <iostream>
 
 struct spis //элемент хеш-таблицы узел списка
 {
    char *val;
    struct spis *next;
};
 
typedef struct spis *dictionary[10];//каждое dictionary[i]-результат хеш-функции
 
 
int ord(char o)//перевод символа в код
{
    return (unsigned char) o;
}
 
int hash (char *x)//хеш-функция
{
 int i,sum=0;
 for(i=0;i<10;i++)
    sum+=ord(x[i]);//суммируем коды символов
  return sum%10; 
}
 
void makenull(dictionary k)//обнуление хеш-таблицы
{
    for(int i=0;i<10;i++)
    k[i]=0;
}
 
bool member(char *x,dictionary k)//проверка на наличие
{
    spis *cur;
    cur=k[hash(x)];//начальное значение равно заголовку сегмента которому принадлежит x
    while (cur!=0)//пока не дойдет до конца 
    {
        if (cur->val==x)//если есть
         return true;//значит есть
        else //иначе
         cur=cur->next;//перемещаться
    }
    return false;
}
 
void insert(char *x,dictionary k)//втавка
{
    
    int symb;//номер сегмента
    spis *oldhead;
    if (!member(x,k)) //если нет то
    {
        char *x1=new char[strlen(x)+1];
            strcpy(x1,x);
        symb=hash(x1);//создаем код для строки
        oldhead=k[symb]; //старой голове присвоить значение k-хешевского
        k[symb]=new spis; //новый элемент типа spis c кодом symb
        k[symb]->val=x1; //записать значение
        k[symb]->next=oldhead; //указатель на следующий элемент сделать на старую голову
    }
}
 
void del(char *x,dictionary k) //удаление
{
    int symb;//для хранения кода 
    spis *cur;//указатель на элемента типа spis
    symb=hash(x);//получаем код для того что хотим удалить
    bool f=true;
    if (k[symb]!=0)//если то что получено не ноль
    {
        if (k[symb]->val==x)
         { //если случилось что элемент удаляемый голова
          spis *chuck=k[symb];//дополнительной переменной значение хеш
          k[symb]=k[symb]->next; //головой стал бывший next
                 delete chuck;//удалеям из памяти
         }
          else //иначе
          {
            cur=k[symb];//присвоим значение элемента с кодом symb
            while((cur->next!=0)&&(f))//пока по этому коду по списку не дойдет последнего или не найдет
             if (cur->next->val==x)//если элемент следующий имеет это значение то
             {
                spis *chuck=cur->next;//присваиваем переменной значения того кого хотим удалить
                        cur->next=cur->next->next;//элемент пред указывает уже не на него на за следующий за ним
                    delete [] chuck->val;
                    delete chuck;
                        f=false;//цикл завершен
             }
             else
             cur=cur->next;//Перемещаемся по списку
          }
    }
}
 
int main()
{
   dictionary d;
   char *s;
   cin>>s;
   insert(s,d);
   makenull(d);
}
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 13:02 #29
кстати, delete chuck там ещё один есть
указатель переделывай в main'е
0
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 16:34  [ТС] #30
Цитата Сообщение от accept Посмотреть сообщение
указатель переделывай в main'е
указатель на что?
0
12.11.2010, 16:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2010, 16:34
Привет! Вот еще темы с ответами:

Указатели и динамические структуры данных - C++
Задание 1. Дан указатель P1 на вершину стека (если стек пуст, то P1 = nil). Из- влечь из стека все элементы и вывести их...

Указатели и динамические структуры данных - C++
В данный момент занимаюсь изучением динамических структур данных и указателей, и вот вот возник вопрос, есть ли разница изучать эту тему в...

Структуры, содержащие указатели на самих себя - C++
Как вообще возможно существование структур, содержащих указатели на самих себя? struct mystruct{ int a; char ch; ...

список (в программе обнуляются указатели на структуры) - C++
здравствуйте помогите найти ошибку, при возврате указателя на структуру из функции в функцию майн он обнуляется, это меня сбивает с толку...


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

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

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