2010-08-08 2 views
1

У меня есть простой вопрос в понимании указателей и структурных определений в коде связанного списка.Нужна помощь со связанными списками;

1)

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

}node; 

здесь, если я использую два "узел", когда я инициализировать узел * голова; на каком узле я имею в виду?

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

3) Кроме того, если я перехожу к функции

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

Я прошу прощения, если это глупый вопрос, я новичок в языке Си.

Благодарности & С уважением, Brett

+0

По соглашению вы можете удалить свою последнюю строку. –

+0

Для (3) как определяется голова? –

+1

Я ожидаю, что это домашние вопросы, так как (2) и (3) кажутся не случайными. Вы можете показать код, как использовать список или инициализировать его для (1), а затем объяснить, что вы думаете для каждого ответа, а затем вы получаете помощь в своем мышлении, а не получаете ответы. –

ответ

0

< 1> в C необходимо указать STRUCT узел для структур

struct node 
    { 
... 
    } node; 

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

node.val = 1; 

и не тип.

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

typedef struct node { .. } node; 

< 2> если вы используете недействительным * вам нужен механизм для обработки, что точка указатели, например, если 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> обратный (узел * голова) голова является указателем на свой список, * голова содержание того, что указатель указывает на первый узел (ниже)

штаб- > [узел следующий] -> [узел следующий] -> [узел следующий]

EDIT: перефразировать и редактировать. EDITx2: видимо, вопрос был отредактирован и добавлен typedef, поэтому вопрос был изменен.

+0

so * head содержит адрес узла next? Также я имею в виду эти два узла. Я хочу знать, как typedef воспроизводит второй удаленный узел. struct node {<--- } node; <- – brett

+0

голова указывает на первый узел в вашем списке. head содержит (а также первый узел содержит, поскольку он указывает там) указатель «следующий», который указывает на следующий узел –

+0

, узел struct node {} не является typedef, если вы хотите ввести typedef, вам нужно написать узел struct typedef {} узел; то вы можете использовать узел как тип, в исходном вопросе «node» не является типом (C89) –

0

*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

Это не полный ответ, потому что я подозреваю домашнее задание. Я просто хочу попытаться указать вам в правильном направлении. –

0

Для # 1:

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

struct foo { ... }; 

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

A typedef дает тип альтернативного имени. typedef имени не нужно быть квалифицированным, так как только вы:

typedef struct foo foo; 

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

За # 2.

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

+0

@Samuel typedef struct foo {...} foo1; сейчас нужно использовать foo1 или foo? Зачем ? – brett

+0

@brett - когда у вас есть 'typedef struct foo {...} foo1;' вы можете написать либо 'struct foo ...', либо 'foo1 ...', эти два эквивалентны. –

Смежные вопросы