Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#双链接列表-上一个和下一个无法连接_C#_Linked List_Doubly Linked List - Fatal编程技术网

C#双链接列表-上一个和下一个无法连接

C#双链接列表-上一个和下一个无法连接,c#,linked-list,doubly-linked-list,C#,Linked List,Doubly Linked List,我正在学习一点链表和双链表 我试图建立一个包含上一个和下一个节点的双链接列表,但当我对程序进行解bug时,“指针”不会在它们应该连接的地方相互连接。在程序运行结束时,打印出来的唯一结果是我想输入列表的最后一个值,它显然是列表中唯一的值 这是我的代码,我相信除了“上一个”和“下一个”节点不会相互连接的问题,它应该是可以的 Node<T> start; Node<T> end; public void AddFirst(T dataToAdd) {

我正在学习一点链表和双链表

我试图建立一个包含上一个和下一个节点的双链接列表,但当我对程序进行解bug时,“指针”不会在它们应该连接的地方相互连接。在程序运行结束时,打印出来的唯一结果是我想输入列表的最后一个值,它显然是列表中唯一的值

这是我的代码,我相信除了“上一个”和“下一个”节点不会相互连接的问题,它应该是可以的

Node<T> start;
    Node<T> end;

    public void AddFirst(T dataToAdd)
    {
        Node<T> tmp = new Node<T>(dataToAdd);
        if (start == null)
        {
            start = tmp;
            end = start;
        }
        tmp.next = start.previous;
        end.next = tmp.previous;
        start = tmp;


        if (start.next == null)
        {
            end = start;
        }
    }

    public void AddLast(T dataToAdd)
    {
        Node<T> tmp = new Node<T>(dataToAdd);
        if (start == null)
        {
            AddFirst(dataToAdd);
        }

        tmp.next = start.previous;
        end.next = tmp.previous;
        end = tmp;
    }

    public T RemoveFirst()
    {
        if (start == null) return default(T);

        T saveVal = start.data;
        end.next = start.next.previous;
        start = start.next;
        if (start == null) end = null;

        return saveVal;
    }

    public T RemoveLast()
    {
        if (start == null) return default(T);

        T saveVal = end.data;
        end.previous.next = start.previous;
        end = end.previous;

        if (start == null) end = null;

        return saveVal;
    }


    public void PrintAll()
    {
        Node<T> tmp = start;
        while (tmp != null)
        {
            Console.WriteLine(tmp.data);
            tmp = tmp.next;
        }
    }

    class Node<T>
    {
        public T data;
        public Node<T> next;
        public Node<T> previous;

        //etc

        public Node(T newData)
        {
            data = newData;
            next = null;
            previous = null;

        }

    }
}
节点启动;
节点端;
公共void AddFirst(T dataToAdd)
{
节点tmp=新节点(dataToAdd);
if(start==null)
{
启动=tmp;
结束=开始;
}
tmp.next=start.previous;
end.next=tmp.previous;
启动=tmp;
if(start.next==null)
{
结束=开始;
}
}
公共void AddLast(T dataToAdd)
{
节点tmp=新节点(dataToAdd);
if(start==null)
{
AddFirst(dataToAdd);
}
tmp.next=start.previous;
end.next=tmp.previous;
end=tmp;
}
公共删除优先()
{
if(start==null)返回默认值(T);
T saveVal=start.data;
end.next=start.next.previous;
start=start.next;
如果(start==null)end=null;
返回saveVal;
}
公共T RemoveLast()
{
if(start==null)返回默认值(T);
T saveVal=end.data;
end.previous.next=start.previous;
end=end.previous;
如果(start==null)end=null;
返回saveVal;
}
public void PrintAll()
{
节点tmp=开始;
while(tmp!=null)
{
Console.WriteLine(tmp.data);
tmp=tmp.next;
}
}
类节点
{
公共数据;
公共节点下一步;
公共节点前向;
//等
公共节点(T newData)
{
数据=新数据;
next=null;
previous=null;
}
}
}

几乎所有的方法都没有连接问题。我已经修改了相同的,它工作得很好

public class DoubleLinkedList <T>
{
    Node<T> start;
    Node<T> end;

    public void AddFirst(T dataToAdd)
    {
        Node<T> tmp = new Node<T>(dataToAdd);
        if (start == null)
        {
            start = tmp;
            end = start;
            return;
        }
        start.previous = tmp;
        tmp.next = start;
        start = tmp;


        if (start.next == null)
        {
            end = start;
        }
    }

    public void AddLast(T dataToAdd)
    {
        if (start == null)
        {
            AddFirst(dataToAdd);
            return;
        }
        Node<T> tmp = new Node<T>(dataToAdd);
        end.next = tmp;
        tmp.previous = end;
        end = tmp;
    }

    public T RemoveFirst()
    {
        if (start == null) return default(T);

        T saveVal = start.data;
        start = start.next;
        start.previous = null;
        if (start == null) end = null;

        return saveVal;
    }

    public T RemoveLast()
    {
        if (start == null) return default(T);

        T saveVal = end.data;
        end = end.previous;
        end.next = null;
        if (start == null) end = null;

        return saveVal;
    }


    public void PrintAll()
    {
        Node<T> tmp = start;
        while (tmp != null)
        {
            Console.WriteLine(tmp.data.ToString());
            tmp = tmp.next;
        }
    }
}
公共类双链接列表
{
节点启动;
节点端;
公共void AddFirst(T dataToAdd)
{
节点tmp=新节点(dataToAdd);
if(start==null)
{
启动=tmp;
结束=开始;
返回;
}
start.previous=tmp;
tmp.next=开始;
启动=tmp;
if(start.next==null)
{
结束=开始;
}
}
公共void AddLast(T dataToAdd)
{
if(start==null)
{
AddFirst(dataToAdd);
返回;
}
节点tmp=新节点(dataToAdd);
end.next=tmp;
tmp.previous=结束;
end=tmp;
}
公共删除优先()
{
if(start==null)返回默认值(T);
T saveVal=start.data;
start=start.next;
start.previous=null;
如果(start==null)end=null;
返回saveVal;
}
公共T RemoveLast()
{
if(start==null)返回默认值(T);
T saveVal=end.data;
end=end.previous;
end.next=null;
如果(start==null)end=null;
返回saveVal;
}
public void PrintAll()
{
节点tmp=开始;
while(tmp!=null)
{
Console.WriteLine(tmp.data.ToString());
tmp=tmp.next;
}
}
}

我认为您应该尝试为代码编写一些单元测试,并一次添加一部分代码。我特别质疑为什么
end.next=tmp.previous有,或者至少在那个时候有。@CodingYoshi谢谢!我会以你为榜样,检查我做错了什么!创建新tmp时,tmp.previous中有什么内容?wink在向双链接列表添加新元素时使用调试器并逐步执行代码。很容易看到你的代码中发生了什么…@elgonzo我使用了debbuger,但我一直认为我的代码是正确的,就像我没有看到问题一样。但我现在明白了,我修正了我的代码。这和你的暗示有关。非常感谢。我修正了我的密码。我现在知道我的问题在哪里了。我需要用更多的步骤来断开链接之间的连接,因为我有下一步和上一步。非常感谢。伟大的如果对你有用的话。请将其标记为接受答案并投赞成票。:)