单链表及C#的实现

链表结构如下:

C#代码实现如下:

Node类

实现节点,包括节点中的数据域和指针域。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Node<T>
    {
        private T data; //数据域
        private Node<T> next; //引用域

        //数据域属性
        public T Data { get => data; set => data = value; }
        //引用域属性
        internal Node<T> Next { get => next; set => next = value; }

        //构造器
        public Node(T val, Node<T> p) {
            Data = val;
            Next = p;
        }

        //构造器
        public Node(Node<T> p) {
            Next = p;
        }

        //构造器
        public Node(T val) {
            Data = val;
        }

        //构造器
        public Node() {
            Data = default(T);
            Next = null;
        }
    }
}

IListDs接口

规定链表的操作接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    public interface IListDs<T>
    {
        int GetLength();//求长度
        void Clear();//清空操作
        bool IsEmpty();//判断线性表是否为空
        void Append(T item);//附加操作
        void Insert(T item, int i);//插入操作
        T Delete(int i);//删除操作
        T GetElem(int i);//取表元
        int Locate(T value);//按值查找
    }
}

LinkList<T>类

实现IListDs接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class LinkList<T> : IListDs<T>
    {
        private Node<T> head;//单链表的头引用

        //头引用的属性
        internal Node<T> Head { get => head; set => head = value; }

        //构造器
        public LinkList() {
            head = null;
        }

        //在链表末尾添加元素
        public void Append(T item)
        {
            Node<T> q = new Node<T>(item);
            Node<T> p = new Node<T>();

            //头节点为空时直接修改头节点的引用
            if (head == null) {
                head = q;
                return;
            }
            p = head;
            
            //遍历至最后一个节点
            while (p.Next != null) {
                p = p.Next;
            }
            
            //将新元素挂载到末尾
            p.Next = q;
        }

        //清空链表
        public void Clear()
        {
            head = null;
        }

        //删除节点
        public T Delete(int i)
        {
            if (IsEmpty() || i < 1) {
                Console.WriteLine("链表为空或位置错误");
                return default(T);
            }
            Node<T> q = new Node<T>();

            //删除头节点
            if (i == 1) {
                q = head;
                head = head.Next;
                return q.Data;
            }
            //遍历删除节点
            Node<T> p = head;
            int j = 1;
            while (p.Next != null && j < i) {
                q = p;
                p = p.Next;
                ++j;
            }
            if (j == i)
            {
                q.Next = p.Next;
                return p.Data;
            }
            else {
                Console.WriteLine("位置不正确");
                return default(T);
            }
        }

        //取第i个元素
        public T GetElem(int i)
        {
            if (IsEmpty()) {
                Console.WriteLine("链表为空");
                return default(T);
            }
            Node<T> p = new Node<T>();
            p = head;
            int j = 1;
            while (p.Next != null && j < i) {
                p = p.Next;
                ++j;
            }
            if (j == i)
            {
                return p.Data;
            }
            else {
                Console.WriteLine("位置不正确!");
            }
            return default(T);
        }

        //求链表的长度
        public int GetLength()
        {
            Node<T> p = head;
            int len = 0;
            while (p != null) {
                p = p.Next;
                ++len;
            }
            return len;
        }

        //插入节点
        public void Insert(T item, int i)
        {
            //插入位置小于1或链表为空时,不能插入
            if (IsEmpty() || i < 1)
            {
                Console.WriteLine("链表为空或位置错误");
                return;
            }
            
            //插入位置为1时,直接在头节点后添加。
            if (i == 1)
            {
                Node<T> q = new Node<T>(item);
                q.Next = head.Next;
                head.Next = q;
                return;
            }

            //先遍历位置,再插入
            int j = 1;
            Node<T> p = head;
            Node<T> r = new Node<T>();
            while (p.Next != null && j < i) {
                r = p;
                p = p.Next;
                ++j;
            }
            if (j == i) {
                Node<T> q = new Node<T>(item);
                Node<T> m = r.Next;
                r.Next = q;
                q.Next = m;
            }
        }
        //判断是否为空
        public bool IsEmpty()
        {
            return head == null;
        }

        //在单链表中查找值为value的节点
        public int Locate(T value)
        {
            if (IsEmpty()) {
                Console.WriteLine("链表为空!");
                return -1;
            }
            Node<T> p = new Node<T>();
            p = head;
            int i = 1;
            while ((p.Next != null) && (!p.Data.Equals(value))) {
                p = p.Next;
                ++i;
            }
            if (p == null)
            {
                Console.WriteLine("不存在这样的节点");
                return -1;
            }
            else {
                return i;
            }
        }
    }
}

Program

程序入口

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            LinkList<string> link = new LinkList<string>();
            //添加元素
            link.Append("123");
            link.Append("567");
            link.Append("jqk");
            link.Append("qwe");
            //插入元素
            link.Insert("abc", 2);
            Node<string> n = link.Head;
            while (n != null) {
                Console.WriteLine(n.Data);
                n = n.Next;
            }
            //获取长度
            Console.WriteLine(link.GetLength());
            //搜索指定value的位置
            Console.WriteLine(link.Locate("567"));
            //查找指定位置的元素
            Console.WriteLine(link.GetElem(4));
        }
    }
}

推荐阅读更多精彩内容