2 / 2 / 0
Регистрация: 19.05.2018
Сообщений: 141
1

Ошибка NullReferenceException не обработано

24.12.2018, 05:57. Показов 1175. Ответов 5

Надо написать код, который реализует операции на списке целых чисел (односвязный список).
У меня после описания операции добавление элемента слева выскакивает ошибка "NullReferenceException не обработано".
Никак не получается разобраться где ошибка - в части "свойство-индексатор для доступа к элементам списка по индексу" или в самой операции.. И новый элемент становится первым, но добавленные справа исчезают.
Помогите, пожалуйста!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
class ListNodes
    {
        Node first = null;      //Голова списка.
        Node last = null;       //Конец списка.
        int size = 0;           //Размер списка. 
        public int Size         //Свойство для доступа к размеру списка
        {
            get
            {
                return size;
            }
            set
            {
                size = value;
            }
        }
        public int this[int i]              //Свойство-индексатор для доступа к элементам списка по индексу
        {
            get
            {
                Node t = first;
                while (t != null & i - 1 > 0)
                {
                    t = t.Next;
                    i--;
                }
                return t.Key;
            }
        }
        public void AddRight(int key_)       //Добавить элемент справа.   
        {
            if (size == 0)
            {
                first = new Node(key_);
                last = first;
                size++; return;
            }
            last.Next = new Node(key_);
            last = last.Next;
            size++;
        }
        public void AddLeft(int key)       //Добавить элемент слева.
         {
             if (size == 0)
             {
                 first = new Node(key);
                 first = last;
                 size++; return;
             }
             first = first.Next;
             first = new Node(key);
             last = last.Next;
             size++;
        }
        public Node PredLast()             //Возвращает указатель на предпоследний узел.
        {
            Node pred = first, lst = first.Next;
            if (Size == 0 | Size == 1)
            {
                return null;
            }
            while (lst.Next != null)
            {
                pred = lst;
                lst = lst.Next;
            }
            return pred;
        }
 
        /*//Выделить голову слева
       public int Head()
       {
       }
       //Выделить голову справа
       public int Head_()
       {
       }
        */
    }
    class Node //Узел списка.
    {
        Node next = null;
        int key;
        public Node Next
        {
            get
            {
                return next;
            }
            set
            {
                next = value;
            }
        }
        public int Key
        {
            get
            {
                return key;
            }
            set
            {
                key = value;
            }
        }
        public Node(int key_)
        {
            key = key_;
            next = null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ListNodes L = new ListNodes();
            L.AddRight(1);
            L.AddRight(2);
            L.AddRight(3);
            L.AddRight(4);
            L.AddRight(5);
            L.AddRight(6);
            L.AddLeft(0);
            for (int i = 1; i <= L.Size; i++)
                Console.WriteLine(L[i]);
            Console.ReadLine();
        }
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2018, 05:57
Ответы с готовыми решениями:

Nullreferenceexception не обработано
Имею такой вот код: using System; using System.Collections.Generic; using...

WebBrowser выдает ошибку "NullReferenceException не обработано"
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Ошибка formatexception не обработано
Добрый день. Пишу программу для построения графка. Суть: из textBox1 считывает значения x, из...

Ошибка ArgumentNulException не обработано
Пытаюсь написать калькулятор в командной строке. При попытке отладки вылетает ошибка...

5
Администратор
Эксперт .NET
13858 / 11233 / 4570
Регистрация: 17.03.2014
Сообщений: 22,646
Записей в блоге: 1
24.12.2018, 10:22 2
Лариса Кузнецов, у тебя ошибка в реализации метода AddLeft. Подумай что делают строки №№50-52 и что они на самом деле должны делать.
Цитата Сообщение от Лариса Кузнецов Посмотреть сообщение
C#
42
43
44
45
46
47
48
49
50
51
52
53
54
        public void AddLeft(int key)       //Добавить элемент слева.
         {
             if (size == 0)
             {
                 first = new Node(key);
                 first = last;
                 size++; return;
             }
             first = first.Next;
             first = new Node(key);
             last = last.Next;
             size++;
        }
Добавлено через 52 секунды
Советую нарисовать на бумаге действия кода чтобы понять что происходит со списком.
0
2 / 2 / 0
Регистрация: 19.05.2018
Сообщений: 141
24.12.2018, 11:21  [ТС] 3
OwenGlendower, когда добавляется элемент слева, то
первый передвигается на место следующего
C#
1
first.Next = first;
а на место первого встает новый элемент
C#
1
first = new Node(key);
а последний, так и остается последним + размер увеличивается.
C#
1
2
3
4
5
6
7
8
9
10
11
12
public void AddLeft(int key)       //Добавить элемент слева.
         {   
             if (size == 0)
             {
                 first = new Node(key);
                 first = last;
                 size++; return;
             }
             first.Next = first;
             first = new Node(key);
             size++;
        }
но ошибка осталась
0
Администратор
Эксперт .NET
13858 / 11233 / 4570
Регистрация: 17.03.2014
Сообщений: 22,646
Записей в блоге: 1
24.12.2018, 11:32 4
Лучший ответ Сообщение было отмечено Лариса Кузнецов как решение

Решение

Цитата Сообщение от Лариса Кузнецов Посмотреть сообщение
первый передвигается на место следующего
C#
1
first.Next = first;
Неа. Первый замыкается сам на себя.

Цитата Сообщение от Лариса Кузнецов Посмотреть сообщение
а на место первого встает новый элемент
C#
1
first = new Node(key);
Да встает, но свойство Next у нового узла остается равным null и значит получается список из одного элемента.
0
2 / 2 / 0
Регистрация: 19.05.2018
Сообщений: 141
24.12.2018, 12:10  [ТС] 5
OwenGlendower, кажется поняла
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public void AddLeft(int key)       //Добавить элемент слева.
         {   
             if (size == 0)
             {
                 first = new Node(key);
                 first = last;
                 size++; return;
             }
             Node f = first;
             first = new Node(key);
             first.Next = f;
             size++;
0
Администратор
Эксперт .NET
13858 / 11233 / 4570
Регистрация: 17.03.2014
Сообщений: 22,646
Записей в блоге: 1
24.12.2018, 12:12 6
Лариса Кузнецов, да, теперь верно.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2018, 12:12

COMException не обработано. Ошибка 80040154
Добрый день, пытаюсь запустить приложение, и получаю ошибку. Раньше все работало нормально, а...

Ошибка TargetInvocationException не обработано
Парни вот фрагмент когда, из-за чего может быть ошибка? if (k ==...

Ошибка: COMException не обработано при работе с Word
Здравствуйте. Пытаюсь воспроизвести один пример с сайта, но подставив свои шаблон документа....

Ошибка FormatException не обработано при вычислении среднего балла
Добрый день. Написал простенькую программу вычисления среднего балла по трем предметам. После...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.