Реализация push / pop в связанном списке (C ++) - PullRequest
0 голосов
/ 24 сентября 2011

Я пытаюсь включить push / pop в связанный список, и я не могу заставить его работать. Когда я запускаю свою тестовую функцию, я устанавливаю свой связанный список на ноль, и я пытаюсь выдвинуть значения, но список продолжает возвращаться без значений в нем. Может ли кто-нибудь сказать мне, что я делаю не так?

Ответы [ 7 ]

1 голос
/ 24 сентября 2011
if (top == NULL){
      current = top;
      current->next = NULL; //NULL->next : will cause segfault
  }

если top равен NULL, вы устанавливаете current = top [который равен NULL], а затем вы получаете доступ к current->next, что приведет к ошибке сегмента, вы пытаетесь получить доступ к NULL ..

РЕДАКТИРОВАТЬ : следите за комментариями:
ваш оператор if кажется избыточным, вам, вероятно, нужно будет только установить: current->next = head; и head = current; [в дополнение к текущему распределению]

0 голосов
/ 02 мая 2014

это мое рабочее решение для стека, содержащего элементы int, но, возможно, лучше создать пустую pushStack, используя Stack ** S вместо Stack * S.

в pop (стек ** S)создал страж, поэтому, если стек пуст, возвращается -1.:

typedef struct StackT {

    int val;
    struct StackT *next;

} Stack;

int isStackEmpty (Stack *S) {

    if (S == NULL)
        return 1;
    else
        return 0;
}


int *pop(Stack **S) {
    Stack *tmp = *S;
    int i = -1;
    if (isStackEmpty(tmp) == 0) {
        i = tmp->val;
        *S = tmp->next;
    }
    return i;
}

Stack *pushStack (Stack *S, int x) {

    Stack *node = (Stack *) malloc (sizeof (Stack));
    node->val = x;
    node->next = S;

    return node;
}

Вы можете легко вызывать pop и stack:

    Stack *S = NULL;
    int x = somevalue;
    int y;
    S = pushStack(S, x);
    y = pop(&S);
0 голосов
/ 30 декабря 2011

Попробуйте этот код ...

void push(data * newpushdata){
    if(head !=null){
        linkednode current = new linkednode(newpushdata);
        current->next = head;
        head = current;
    }
    else {
       head = new linkednode(newpushdata);
    }
}
0 голосов
/ 24 сентября 2011

не могли бы вы указать атрибуты класса связанного списка? [есть ли шанс, что вы делаете что-то не так]

Вместо тебя я бы сделал:

void push(Data * newPushData){
if (head   == NULL) 
    head->data = newPushData
    tail = head ; 

else // regular situation 
     { 
     Node  * node  = new Node() ; 
     tail->next = node; 
     node->data  = newPushData; 
     node->next  = NULL ;
     tail  = node ; 
   } 

}

В связанном списке вы должны поддерживать указатель заголовка на заголовке списка, указывать, что указатель хвоста - это указатель на конец списка, Вы должны позаботиться о 2 случаях расширения списка. лучший способ обучения - проиллюстрировать вставку в пустом связанном списке.

Береги себя S

0 голосов
/ 24 сентября 2011
void push(Data * newPushData)
{
    if( head != NULL )
    {
        LinkNode current = new LinkNode(newPushData);
        current->next = head;
        head = current;
    }
    else
    {
        head = new LinkNode(newPushData);
    }
}
0 голосов
/ 24 сентября 2011

Переменная top является локальной переменной для функции push(...).Вместо этого вы можете использовать head, и я бы предпочел изменить оператор if.

Я думаю, что функция должна выглядеть следующим образом:

void push(Data * newPushData){
    LinkNode * current = new LinkNode(newPushData);
    if (head != NULL){
        current->next = head;
        head = current;
    }
    else{
        head = current;
        current->next = NULL; // if you haven't done it in LinkNode constructor
    }
}
0 голосов
/ 24 сентября 2011

Вместо

 if (top == NULL){
      current = top;
      current->next = NULL;
 }

вы хотите

 if (top == NULL){
      top = current;
      current->next = NULL;
 }

И, конечно же, после этого вы должны убедиться, что вы на самом деле снова установите head в top.

Теперь, когда вы внесли это изменение, должно быть ясно, что в обоих случаях выполняется одно и то же, поэтому на самом деле никакого различия не требуется.Таким образом, функция может быть упрощена до

void push(Data * newPushData){
    LinkNode * current = new LinkNode(newPushData);
    current->next = head;
    head = current;
}
...