Нужна помощь с связанными списками; - PullRequest
1 голос
/ 08 августа 2010

У меня простой вопрос в понимании указателей и определений структур в коде связанного списка.

1)

typedef struct node
{
 struct node* next;
 int val;

}node;

здесь, если я использую два «узла» при инициализации узла * head; на какой узел я ссылаюсь?

2) Здесь я использую int val в структуре. Если я использую void * вместо int, что-нибудь изменится?

3) Также, если я перейду к функции

reverse(node* head)
{
    node* temp = head; or node* temp = *head;     
    //what is the difference between the two
}

Извините, если это глупый вопрос, я новичок в языке c.

Спасибо и С уважением, Brett

Ответы [ 3 ]

0 голосов
/ 08 августа 2010

*head - разыменование указателя: то есть фактическое место в памяти, на которое указывает указатель head ...

Думайте о head как о вешалке, а *head как о самом пальто, если это поможет.

есть:

struct * coat c; //this is a coat hanger, not a coat
....
struct coat k = *c;//this is the coat itself, not a coat hanger 
0 голосов
/ 08 августа 2010

Для # 1:

В C структуры имеют отдельное пространство имен.Так что, если вы написали:

struct foo { ... };

Затем вам нужно использовать struct foo для ссылки на тип.Если вы попробовали просто foo после вышеприведенного определения, компилятор выдаст ошибку, поскольку ничего не знает об этом неквалифицированном имени.

A typedef дает типу альтернативное имя.* typedef имя не нуждается в уточнении, поэтому, как только вы это сделаете:

typedef struct foo foo;

Теперь вы можете использовать неквалифицированное foo для ссылки на тип.Поскольку это просто альтернативное имя, теперь вы можете использовать struct foo и foo взаимозаменяемо.

Для # 2.

Возможно, что если вы измените val на void *, это может изменить размер всей структуры.Будет ли это иметь значение, будет зависеть от того, как вы написали оставшуюся часть кода.

0 голосов
/ 08 августа 2010

<1> в C вам нужно указать структурный узел для структур

    struct node 
    {
...
    } node;

последний 'узел' является переменной типа структурного узла, например,

node.val = 1;

, а не типом.

если вы хотите использовать 'узел' в качестве типа, вам нужно написать

typedef struct node { .. } node;

<2> если вы используете void *, вам понадобится механизм для обработки того, на что указывают указателинапример, если void * указывает на целое число, вам нужно сохранить целое число либо в стеке, либо в куче.

node n;
int value = 1;
n.val = &value; // pointing to a single integer on stack

int values[]={1,2,3};
n.val = values; // pointing to an array of integers on stack

void* ptr = malloc(sizeof(int));
n.val = ptr;  // pointing to a single (uninit) integer allocated on heap
int* ptrval = (int*)ptr; // setting an int ptr to the same memory loc.
*ptrval = value; // ptrval now points to same as n.val does

<3> reverse (node ​​* head) head - указатель на ваш список, * headявляется содержимым того, на что указывает указатель (первый узел ниже)

head -> [node next] -> [node next] -> [node next]

РЕДАКТИРОВАТЬ: перефразировано и отредактировано.EDITx2: очевидно, вопрос был отредактирован и добавлен typedef, поэтому вопрос был изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...