2015-10-30 1 views
1

У меня есть заголовок, который объявляет стек и список. Я пытаюсь добавить узел застрял в списке, но я не могу этого сделать. Может кто-нибудь помочь мне понять, почему эта функция не работает?Почему я получаю ошибки при попытке вставить новый узел в список

**** как эти коды declerations в заголовках ***

/* a link that contains a positive integer value*/ 
struct link 
{ 
    int value; 
    struct link *next; 
}; 

typedef struct link link; 

typedef struct 
{ 
    link *head; 
} linkedList; 

/* a positive-integer value stack, with no size limit */ 
typedef struct stack 
{ 
    int count; 
    int maxSize; 
    bool empty; 
    linkedList* list; 
} stack; 

Теперь то, что я пытаюсь сделать это:

void add(linkedList *list, int newValue) 
{ 
    linkedList* temp = list; 


    while (temp->head) 
    { 
     temp->head = temp->head->next; 
    } 


    temp->head->next->value = newValue; //<---- this line is making the error 
} 

// add new link in the beginning of list with newValue in it 
+0

Не знаете, что вы подразумеваете под «не работает». Можете ли вы объяснить, что он делает и что вы ожидаете от него? Одна очевидная проблема заключается в том, что цикл 'while' заканчивается, когда' temp-> head' является 'NULL', а затем в самом следующем после цикла' while' вы пытаетесь использовать 'temp-> head_> next' ie '(NULL) -> next'. Это проблематично. Аналогично, вы устанавливаете' temp1' в 'NULL', никогда не изменяете его в цикле' while', а затем пытаетесь получить доступ к 'temp1-> head' ie '(NULL) -> head'. Вы можете проверить все это, если y ou запустите свою программу в отладчике. – crayzeewulf

+0

does not work означает, что каждый раз, когда я пытаюсь поместить другую ссылку внутри списка, который находится внутри стека, он не работает, он дает мне ошибку messege и показывает мне, что параметры sub head (value) и (next) can not считываются в памяти , но что касается того, что вы сказали ранее, я могу удалить temp1, но что мне делать с этим? – TotalyNotUbisoft

+0

Пожалуйста, добавьте точное сообщение об ошибке (например, копирование и вставка) в вопрос. – crayzeewulf

ответ

0

В add, вы в настоящее время изменяете temp->head, чтобы пройти его по списку. temp - это локальная переменная, но она указывает на реальный связанный список, поэтому, когда вы назначаете temp->head, это изменяет структуру самого списка.

Я предположил бы, что ваше реальное намерение было что-то подобное:

void add(linkedList *list, int newValue) 
{ 
    link *temp = list->head; 

    while (temp->next != nullptr) 
     temp = temp->next; 

    link *node = new node; 
    node->next = nullptr; 
    node->value = newValue; 
    temp->next = node; 
} 

Для стека, однако, вам не нужно (или хотят), чтобы пройти список, прежде чем добавить новый элемент.

void add(linkedList *list, int newValue) { 
    link *node = new link; 
    node->next = list->head; 
    node->value = newValue; 
    list->head = node; 
} 

Как всегда, дважды подумайте об использовании связанного списка (если у вас есть выбор). По крайней мере, по моему опыту, редко действительно полезная структура данных (особенно в таком случае, когда вы храните небольшие предметы), в типичной 64-битной реализации каждый узел будет 32-битным int и 64-разрядный указатель, поэтому вы используете в два раза больше места для указателей, чем для самих данных.

+0

Спасибо за ответ @Jerry Coffin, он отлично работает (надеюсь, я смогу понять свою ошибку там), но поверьте мне, когда я вам скажу: я didnt есть любой выбор :( – TotalyNotUbisoft

+0

, но если бы я мог просто задать вам другой вопрос ... Как удалить ссылку после того, как я ее создал? – TotalyNotUbisoft

+0

@TotalyNotUbisoft: Обычным является попытка сохранить один вопрос ... один вопрос. Если у вас есть другой вопрос, пошлите еще один вопрос. –

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