Реализация связанного списка - сбой программы - PullRequest
0 голосов
/ 10 января 2011

Я разрабатывал общий связанный список. Хотя компилятор не выдает никакой ошибки, но при запуске программы он просто вылетает. Я не смог выяснить, что не так, но так как я пытаюсь вставить метод списка в main, проблема где-то там сама. Вот код в List.h

#include<cstdlib>

enum Error_code
{
    success,
    overflow,
    underflow,
    range_error
};

template<class Node_entry>
struct Node
{
    Node_entry entry;
    Node<Node_entry> *next;

    Node()
    {
        next=NULL;
    }

    Node(Node_entry item, Node<Node_entry> *add_on=NULL)
    {
        entry=item;
        next=add_on;
    }
};

template<class List_entry>
class List
{
  public:
    List()
    {
        count=0;
        head=NULL;
    }

    Error_code insert(int position, const List_entry &x)
    {
        if(position<0 || position>count)
            return range_error;
        Node<List_entry> *previous, *following, *new_node;
        if(position>0) {
            previous=set_position(position-1);
            following=previous->next;
        } else {
            following=head;
        }
        new_node = new Node<List_entry>(x, following);
        if(new_node==NULL)
            return overflow;
        if(position==0)
            head=new_node;
        else
            previous->next=new_node;
        count++;
        return success;
    }

    Error_code remove(int position, List_entry &x)
    {
        if(position<0 || position>count)
            return overflow;
        Node<List_entry> *old_node, *previous;
        if(position==0)
            old_node=head;
        else {
            previous=set_position(position-1);
            old_node=previous->next;
        }
        if(old_node==NULL)
            return underflow;
        if(position==0) {
            head=old_node->next;
            delete old_node;
        } else {
            previous->next=old_node->next;
            delete old_node;
        }
        count--;
        return success;
    }

    bool empty() const
    {
        return count==0;
    }

    ~List()
    {
        Node<List_entry> *temp_node=head->next;
        while(!empty()) {
            delete head;
            head=temp_node;
            temp_node=head->next;
        }
    }

  protected:
    int count;
    Node<List_entry> *head;

    Node<List_entry> *set_position(int position)const
    {
        Node<List_entry> *q=head;
        for(int i=0;i<count;i++)
            q=q->next;
        return q;
    }
};

main.cpp

#include <iostream>
#include"List.h"
using namespace std;
int main()
{
    int i;
    List<int> the_list;
    the_list.insert(1, 2);
}

P.S Пока я только изучаю основы, а не работаю над крупномасштабными модулями и практиками проектирования. На данный момент, это только должно работать.

Ответы [ 3 ]

4 голосов
/ 10 января 2011

Вы устанавливаете head в NULL в конструкторе, но не проверяете null ни в одной из ваших функций.В set_position вы слепо пытаетесь перебрать заголовок и сопровождающие узлы, не проверяя, действительно ли они существуют.

1 голос
/ 10 января 2011

Что происходит в вашей функции main:

  1. Построить список;Успех.
  2. Попробуйте insert в позиции 1, которая заканчивается range_error, потому что position>count.Если вы решили вернуть коды ошибок, вы всегда должны проверять их.
  3. Уничтожить список.Это ошибка, потому что head равен NULL, когда вы пытаетесь разыменовать его с помощью Node<List_entry> *temp_node=head->next;
1 голос
/ 10 января 2011

Просто чтобы добавить к другим ответам - метод set_position содержит ошибку, он использует count вместо position.

...