2014-02-13 5 views
0

Я просто сделал этот код, и его так сложно проверить, есть ли список is связан как следует. Возможно ли узнать, есть ли у меня правильно?Связанный ли это список?

.h файл:

#include <stdio.h> 
#include <stdlib.h> 

struct talstrul 
{ 
    int num; 
    struct talstrul *next; 


}; 

.c файл:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "clabb2head.h" 

void main() 
{ typedef struct talstrul talstrul; 
    int vek[5] = {1,2,3,4,5}; 
    talstrul *pek1=NULL; 
    int langd = sizeof(vek)/sizeof(vek[0]); 

    int i; 
    for(i=0; i<langd; i++) 
    { 
     talstrul obj1; 
     obj1.num = vek[i]; 
     obj1.next = pek1; 
     pek1 = &obj1; 

    } 

    printf("%d",*pek1); 
} 

Я знаю, по крайней мере, что pek1 указывает на значение 5, так что-то правильно по крайней мере :)

Что делать, если я изменить основную программу на:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "clabb2head.h" 

void main() 
{ typedef struct talstrul talstrul; 
    int vek[] = {1,2,3,4,5,9}; 
    talstrul *pek1=NULL; 
    int langd = sizeof(vek)/sizeof(vek[0]); 

    int i; 
    for(i=0; i<langd; i++) 
    { 
     talstrul *obj1 = malloc(sizeof(talstrul)); 
     obj1->num = vek[i]; 
     obj1->next = pek1; 
     pek1 = obj1; 

    } 

    printf("%d",*pek1); 
} 

Следует ли сохранить список?

+0

Да это:) Но я бы не рекомендовал вам создать связанный список, который был бы сложным – mangusta

+5

'talstrul obj1;' является локальным объектом и будет использоваться на каждой итерации цикла. После цикла он будет недоступен, и pek1 все еще указывает на него. – wildplasser

+3

Нет ... вы закончите с 'pek1', указав на' talstrul', который больше не действителен, поскольку 'obj1' был локальным для цикла for ... и результаты предыдущих итераций не сохраняются. – Dmitri

ответ

1

Как я понимаю, как структуры распределяются и освобождаются, ваши «talstrul» элементы строятся на стеке, а затем уничтожаются в конце его. Вы должны выделить их, используя malloc (и, конечно же, освободите его с помощью free в конце), а затем назначьте полученный указатель вашему «следующему» значению.

Кроме того, вам необходимо отслеживать, где находится ваш «головной» объект. Каждый объект указывает вперед, а не назад, а это значит, что в конце у вас есть указатель на последний объект, но нет способа найти, где находится первый объект.

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