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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.78
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
06.11.2010, 18:20     Указатели на структуры #1
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];
такой?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.11.2010, 03:22     Указатели на структуры #2
C
1
2
3
4
5
6
7
8
struct celltype {
    int element;
    struct celltype *next;
};
 
...
 
    struct celltype *dictionary[B - 1];
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.11.2010, 00:21  [ТС]     Указатели на структуры #3
и теперь к структуре можно обращаться как
C
1
dcitionary d
?

Добавлено через 20 минут
C
1
2
3
4
5
typedef struct spis {
    int val;
   spis *next;
};
typedef struct spis *dictionary[100];
такая запись будет эквивалентна?

Добавлено через 3 часа 58 минут
как к структуре то обращаться?

И в параметрах её можно будет передавать как
C++
1
int chuck(dicitonary *k)
C++
1
2
3
4
5
void makenull(dictionary *k)
{
    for(int i=0;i<100;i++)
    k[i]=0;
}
например такой код не работает если
C++
1
2
dictionary a[100];
   makenull(&a[100]);
?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.11.2010, 01:33     Указатели на структуры #4
C
1
2
3
4
typedef struct spis {
    int val;
   spis *next;
};
это неправильно, при typedef всегда нужно указывать имя типа, который определяешь, а здесь его нет

C
1
typedef struct spis *dictionary[100];
это правильно, новое имя типа будет называться dictionary

dictionary d; - переменная d, имеющая тип "массив из ста указателей на struct spis"

достаточно передать только имя массива
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int chuck(dictionary d);
 
...
 
    chuck(d);
 
...
 
int chuck(dictionary d)
{
    printf("%d" "\n", d[0]->val);
 
    return 0;
}
Добавлено через 1 минуту
указатели сами по себе структурами не являются, поэтому для начала нужно создать структуры и потом их адресы записать в массив указателей на структуры и только потом можно будет обращаться к ним
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.11.2010, 01:59  [ТС]     Указатели на структуры #5
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
#include <iostream>
 
struct spis {
int val;
struct spis *next;
};
typedef struct spis *dictionary[100];
 
 
//тут будет хеш-функция которая возвратит значения элементом массива типа dictionary
 
void makenull(dictionary k)
{
    for(int i=0;i<100;i++)
    k[i]=0;
}
 
bool member(int x,dictionary k)
{
    spis *cur;
    cur=k[hash(x)];
    while (cur!=0)
    {
        if (cur->val=x)
        return true;
        else
        cur=cur->next;
    }
    return false;
}
 
void insert(int x,dictionary k)
{
    int symb;
    spis *oldhead;
    if (!member(x,k))
    {
        symb=hash(x);
        oldhead=k[symb];
        spis *k[symb]=new spis;
        k[symb]->val=x;
        k[symb]->next=oldhead;
    }
}
 
void del(int x,dictionary k)
{
    int symb;
    spis *cur;
    symb=hash(x);
    bool f=true;
    if (k[symb]!=0)
    {
        if (k[symb]->val==x)
          k[symb]=k[symb]->next;
          else
          {
            cur=k[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;
   makenull(d);
}
То есть теоретически этот код может работать.

Добавлено через 3 минуты
Цитата Сообщение от accept Посмотреть сообщение
C
1
2
3
4
typedef struct spis {
* * int val;
* *spis *next;
};
это неправильно, при typedef всегда нужно указывать имя типа, который определяешь, а здесь его нет
C++
1
2
3
4
5
typedef struct deque
{
    int val;
    deque *prev,*next;
};
А тут работает
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.11.2010, 06:16     Указатели на структуры #6
C++
1
2
3
4
5
typedef struct deque
{
        int val;
        deque *prev,*next;
};
это неправильно

C++
1
2
3
4
5
typedef struct deque
{
        int val;
        deque *prev,*next;
} NewType;
видишь NewType, вот он задаёт новое имя типа (typedef определят новое имя типа всегда, он не бывает просто так)

это работает и typedef там не нужен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
struct d {
    d *var;
};
 
int main(void)
{
    d n;
    
    n.var = 0;
    
    return 0;
}


Добавлено через 3 минуты
C
1
typedef struct spis *dictionary[100];
вот здесь ошибки нет, почему? да потому что идентификатор задан

а где ты структуру делал - это всё равно что ты написал
C
1
typedef struct spis *[100];
где новое имя для типа? нигде

C
1
struct x { int a, b, c; } s;
вот так создаётся структура, следовательно также используется в typedef'е
C
1
typedef struct x { int a, b, c; } s;
была переменная s структурного типа struct x
а стало новое имя s структурного типа struct x

Добавлено через 8 минут
C
1
if (cur->val=x)
операции тоже подучи, надо ==

C++
1
spis *k[symb]=new spis;
это что ?

надо
C++
1
k[symb] = new spis;
Добавлено через 4 минуты
C
1
if (cur->next->val=x)
тоже
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.11.2010, 13:33  [ТС]     Указатели на структуры #7
ну с = это я после паскаля частенько путаю с ==
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
10.11.2010, 14:22     Указатели на структуры #8
Цитата Сообщение от Artishok Посмотреть сообщение
ну с = это я после паскаля частенько путаю с ==
Отучайтесь, ибо с точки зрения компилятора это выглядит вполне закономерно, а вот хаос в программу может внести неимоверный.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.11.2010, 23:28  [ТС]     Указатели на структуры #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
хаос в программу может внести неимоверный.
да встречал

Добавлено через 1 час 3 минуты
C++
1
2
3
4
5
typedef struct
{
 int x;
char val;
}type;
В данном случае создается тип?

Добавлено через 2 часа 27 минут
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
#include <iostream>
 
 struct spis //ýëåìåГ*ГІ õåø-ГІГ*áëèöû óçåë Г±ГЇГЁГ±ГЄГ*
 {
    char *val;
    struct spis *next;
};
 
typedef struct spis *dictionary[10];//ГЄГ*æäîå dictionary[i]-ðåçóëüòГ*ГІ õåø-ГґГіГ*êöèè
 
 
int ord(char o)//ïåðåâîä ñèìâîëГ* Гў êîä
{
 int a;
 a = o;
 return a;
}
 
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)) //åñëè Г*ГҐГІ ГІГ®
    {
        symb=hash(x);//ñîçäГ*ГҐГ¬ êîä äëÿ ñòðîêè
        oldhead=k[symb]; //Г±ГІГ*ðîé ãîëîâå ïðèñâîèòü Г§Г*Г*Г·ГҐГ*ГЁГҐ Г*îâîãî Г*Г*Г·Г*Г«Г*
        k[symb]=new spis; //Г*îâûé ýëåìåГ*ГІ ГІГЁГЇГ* spis c êîäîì symb
        k[symb]->val=x; //Г§Г*ГЇГЁГ±Г*ГІГј Г§Г*Г*Г·ГҐГ*ГЁГҐ
        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;
   strcpy(s,"Chuck");
   insert(s,d);
   makenull(d);
}
апогеем всего этого служит этот код по открытому хешированию.но вот не задача - вылетает с ошибкой!Help
Видимо что-то не так с хеш-функцией

Добавлено через 1 минуту
вот кстати её прототип с паскаля

Pascal
1
2
3
4
5
6
7
8
Function  h ( х: nametype ): 0..B-1; 
var   i, sum: integer; 
begin 
sum:= 0; 
for  i:= 1  to  10  do 
sum:= sum + ord( x[i] ); 
h:= sum  mod  В 
end;
Добавлено через 2 часа 38 минут
такой вопрос:при закрытом хешировании создавать структуру список не надо т.к. хранится в кадом элементе массива один только элемент?
т.е.
C
1
typedef struct char dictionary[длина строки][кол-во номеров]
?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.11.2010, 01:38     Указатели на структуры #10
Цитата Сообщение от Artishok Посмотреть сообщение
да встречал

C++
1
2
3
4
5
typedef struct
{
 int x;
char val;
}type;
В данном случае создается тип?
в данном случае структура создаётся без метки, но typedef для такого безымянного структурного типа задаёт имя, которое называется type

C++
1
2
3
4
5
struct
{
 int x;
char val;
}type;
а вот такая задаёт одну структуру с именем type
дальше ты можешь использовать type, где она видна type.x, type.val
но создать ещё одну структуру где-нибудь в другом месте с таким же структурным типом ты не можешь, потому что у этого структурного типа нет метки

C
1
2
    char *s;
    strcpy(s,"Chuck");
это та же ошибка с указателями, ты создал указатель, а он не хранит адрес какой-нибудь более-менее вместительной строки, и ты начинаешь брать из него адрес и записывать по тому адресу символы
в указатель нужно сначала записать адрес первого символа какой-нибудь строки, чтобы потом получать доступ к той строке и писать в неё
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.11.2010, 16:26  [ТС]     Указатели на структуры #11
Цитата Сообщение от accept Посмотреть сообщение
C
1
2
char *s;
strcpy(s,"Chuck");
это та же ошибка с указателями, ты создал указатель, а он не хранит адрес какой-нибудь более-менее вместительной строки, и ты начинаешь брать из него адрес и записывать по тому адресу символы
в указатель нужно сначала записать адрес первого символа какой-нибудь строки, чтобы потом получать доступ к той строке и писать в не
а так код правильно вообщем?
Sudoki
124 / 64 / 1
Регистрация: 19.04.2010
Сообщений: 196
11.11.2010, 16:40     Указатели на структуры #12
может так:
C++
1
2
3
4
5
typedef struct 
{
        char *s;
        spis *next;
}spis, *dictonary;
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.11.2010, 21:26     Указатели на структуры #13
C
1
2
3
4
5
6
int ord(char o)//перевод символа в код
{
 int a;
 a = o;
 return a;
}
надо так
C
1
2
3
4
int ord(char o)
{
    return (unsigned char) o;
}
Добавлено через 1 минуту
C
1
2
3
4
5
6
7
int hash (char *x)//хеш-функция
{
 int i,sum=0;
 for(i=0;i<10;i++) 
   sum+=ord(x[i]); //символ в код
  return sum%10; 
}
тебе надо было вообще её написать вот так
C
1
2
3
int hash (char *x)//хеш-функция
{int i,sum=0;for(i=0;i<10;i++)sum+=ord(x[i]);//символ в код
return sum%10;}
ведь так её читать гораздо удобнее

C
1
2
3
4
5
6
7
8
int hash(char *x)//хеш-функция
{
    int i, sum = 0;
 
    for (i = 0; i < 10; i++) /* в таком случае 10 лучше передавать в функцию */
        sum += ord(x[i]); //символ в код
    return sum % 10; 
}
Добавлено через 6 минут
C
1
2
3
4
        if (cur->val==x)//если есть
        return true;//значит есть
        else //иначе
        cur=cur->next;//перемещаться
то же самое, если что-то относится к if, должен быть отступ, если что-то относится к else, должен быть отступ
C
1
2
3
4
        if (cur->val == x)//если есть
            return true;//значит есть
        else //иначе
            cur = cur->next;//перемещаться
Добавлено через 3 минуты
в функции insert() должна создаваться копия строки через malloc()
иначе при добавлении адреса буфера, тебе нельзя будет ничего в него поместить потом, потому что он перезатрётся, а ты в таблицу сохраняешь указатель на него (изменится значение в таблице незаметно)

Добавлено через 1 минуту
функция del() - проблема с отступами
все отступы должны быть одной длины
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.11.2010, 22:16  [ТС]     Указатели на структуры #14
Цитата Сообщение от accept Посмотреть сообщение
в функции insert() должна создаваться копия строки через malloc()
это копия переданная через указатель?

Добавлено через 52 секунды
Цитата Сообщение от accept Посмотреть сообщение
проблема с отступами
отступами от чего?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.11.2010, 23:16     Указатели на структуры #15
ты передаёшь строку, потом у неё внутри функции считаешь длину, выделяешь память под эту длину (плюс один для нуль-символа), потом записываешь эту строку в эту память strcpy(), потом эту память сохраняешь в узел
потом, в конце работы с таблицей или узлом, память из под строки освобождаешь

отступы от левого края исходника, должно быть по уровням, чтобы было видно, где и что выполняется
Artishok
ЧакЭ одобряЭ
 Аватар для 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;
так?
accept
4838 / 3237 / 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; // один отступ, длина четыре
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 01:01  [ТС]     Указатели на структуры #18
на visual studio придется перейти.там автоматически отступы ставятся

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

Добавлено через 1 минуту
код все равно не работает.вылетае с ошибкой
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2010, 01:02     Указатели на структуры #19
Artishok, почти во всех вменяемых IDE имеются автоотступы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2010, 01:03     Указатели на структуры
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 01:03  [ТС]     Указатели на структуры #20
в блокноте нет
Yandex
Объявления
12.11.2010, 01:03     Указатели на структуры
Ответ Создать тему
Опции темы

Текущее время: 07:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru