2012-09-28 2 views
0

Я просмотрел другие вопросы, но никто из них не ответил на мой вопрос. Я пытаюсь создать отдельно связанный список, который добавляет из хвоста для назначения класса.Добавление в хвост связанного списка в C

/** List node **/ 
typedef struct node_type 
{ 
    struct node_type *next;   /* Pointer to next node    */ 
    void *objPtr;      /* Pointer to associated object  */ 
} node_t; 

/** List structure **/ 
typedef struct list_type 
{ 
    node_t *head;      /* Pointer to front of list   */ 
    node_t *tail;      /* Pointer to end of list    */ 
} list_t; 

list_t *newList() { 
    list_t *list; 
    list = (list_t *)malloc(sizeof(list_t)); 

    list -> head = NULL; 
    list -> tail = NULL; 
    return(list); 
} 

Это были предоставленные мне конструкции. Моя функция для добавления, как это:

/** l_add -- add an object to the linked list **/ 
void l_add(list_t *list, void *objPtr) { 
    node_t *newNode; 
    newNode = (node_t *)malloc(sizeof(node_t)); 

    newNode -> objPtr = objPtr; 
    newNode -> next = NULL; 

    if ((list -> head == NULL) && (list -> tail == NULL)) { 
    list -> head = newNode; 
    list -> tail = newNode; 
    } else { 
    list -> tail -> next = newNode; 
    list -> tail = newNode; 

} 
} 

и мои связанные итераторы функции, как это:

iterator_t *newIterator(list_t *list) { 

    iterator_t *itr; 
    itr = (iterator_t *)malloc(sizeof(iterator_t)); 

    itr -> list = list;      
    itr -> position = list -> head; 

    return(itr); 
} 

void *l_next(iterator_t *iter) { 
    void *object; 

    if ((iter -> position) == NULL) { 
     return NULL; 
     exit(0); 
    } else { 
     object = iter -> position -> next; 
     iter -> position = iter -> position -> next; 
} 
    return object; 

} 

void l_begin(iterator_t *iter) { 
    iter -> position = iter -> list -> head; 
} 

Это не дает мне никаких ошибок, когда я скомпилировать его, я получаю большие значения что я предполагаю, это память вместо данных, которые я должен получать. Первое значение, которое я передаю, это «5», и число, первое в списке, колеблется, но находится в миллионах. Я все еще пытаюсь привыкнуть к указателям, кто-нибудь знает, почему я добавляю адрес, а не значение?

код, где я использую его:

size = sizeof(data)/sizeof(int); 
    for(index = 0; index < size; index++) { 
     l_add(list1, &data[index]); 
    } 

    l_begin(iter1); 
    ptr1 = l_next(iter1); 
    fprintf(stdout, "First value=%d\n", *ptr1); 

И песни1 это:

int data[] = {5, 10, 15, 20, 25}; 
list_t *list1; 
list1 = newList(); 

* Обновленный, чтобы включать функции печати и мой итератор. Я не думал, что проблема была там, но может быть. Извините за такой длинный вопрос, я попытался его отредактировать, поэтому есть не так много кода, поэтому, надеюсь, все имеет смысл, и я не испортил то, что пытался показать.

Все вы, ребята, получили это примерно в то же время, спасибо за помощь!

+1

Можете ли вы показать нам код, в котором вы его используете? – Nate

+0

@tbert Обратите внимание, что [тег домашней работы теперь выведен из строя и больше не должен использоваться] (http://meta.stackexchange.com/q/147100). – Gilles

ответ

0

Казалось бы, вы не разыскиваете objPtr. Вот почему вы получаете большие значения.

Я предполагаю, что l_next должен возвращать node_type. В этом случае вам потребуется:

fprintf(stdout, "First value=%d\n", *((int*)ptr1->objPtr)); 

Чтобы не изменить fprintf изменить объект = в l_next к:

object = iter -> position -> next -> objPtr; 

Кроме того, вы, вероятно, должны знать, что l_next не будет на самом деле итерацию. Он не меняет значение позиции в iter.

+0

Когда я меняю это, он говорит: «error: запрос для члена objPtr» в чем-то, что не является структурой или объединением ». Мы также не должны менять заявления на печать, так что я думаю, что мне нужно что-то изменить в одной из функций, которые я написал, что будет вторым и третьим большими блоками. Спасибо за то, что у меня поднялся вопрос о l_next, хотя это исправлено. – Jaghancement

+0

@Jaghancement Я предполагал, что вы должны были вернуть указатель node_type и при необходимости изменить печать. Если вы не должны менять отпечатки, вам нужно вернуть iter -> position -> next -> objData вместо iter -> position -> next. (Предполагая, что вы хотите вернуть следующее значение вместо текущего значения). – CrazyCasta

+0

О, это прекрасно работает, спасибо! – Jaghancement

0

Необходимо передать указатель на ваше значение 5. Таким образом, вместо того, чтобы передать «5» в выделении памяти для целого установлено, что 5 затем передать указатель для выделения памяти в:

int * newObject = (int *)malloc(sizeof(int)); 

*newObject = 5; 

l_add(list, newObject); 

Чтобы получить его, вы будете нуждаться в разыменовать объект, независимо от типа вы создание экземпляра . 5 значения в

Ну, теперь, когда вы выложили остальную часть кода, он выглядит, как вы захватывая следующую структуру узла, как ваши итераторы возвращаются объект вместо реального объекта здесь:

object = iter -> position -> next; 

он должен как:

object = iter -> position -> objPtr; 
+0

Не было бы так же, как: 'void l_add (list_t * list, void * objPtr) { newNode = (node_t *) malloc (sizeof (node_t)); newNode -> objPtr = objPtr; newNode -> next = NULL; l_add (list1, & data [index]); } ' ? – Jaghancement

0

Ваш l_next не работает; вы возвращаете узел next вместо объекта.Это должно быть:

void *l_next(iterator_t *iter) { 
    void *object; 

    if ((iter -> position) == NULL) { 
     return NULL; 
     exit(0); 
    } else { 
     object = iter -> position -> objPtr; 
     iter -> position = iter -> position -> next; 
} 
    return object; 

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