c#数据结构——单链表

来源:互联网 发布:雾霾吸入 知乎 编辑:程序博客网 时间:2024/06/13 19:40

单链表

1.单链表的存储特点是 链式存储,顺序表的缺点是插入和删除元素很麻烦,因为它要移动很多元素,但查找很方便。单链表 等链式表失去了顺序表的随机存储的特点,但是修改链表很方便.
2顺序表.随机存储:找顺序表某一个元素所花的时间都一样,链表要想知道这个其中一个元素,比如知道上一个元素的位置,就不是随机存储.

3.单链表 每一个元素是由结点组成,结点分为data(数据)和next(下一个元素的地址)两部分.

单链表的实现

1.创建一个node  存放结点的信息. h 头结点只有地址。c# 语言可以使用指针,但我们这里使用引用类型实现。


public class MyNode<T>    {        private T data;//数据        private MyNode<T> next;//下一个元素地址        //属性因为要在外部赋值        public T Data {            get { return data;}            set { data = value; }        }        public MyNode()        {            next = null;            data = default(T);        }        public MyNode<T> Next        {            get { return next;}            set {next= value; }        }               public MyNode(T a)  //只有数据部分,尾结点的情况        {            data = a;            next = null;        }        public MyNode(MyNode<T> pNode)        {            next = pNode;            data = default(T);//T是引用返回null,值返回0;        }        public MyNode(T a,MyNode<T> pNode )        {            this.data = a;            this.Next = pNode;        }    }
2.实现单链表的方法 链表名LinkList
public class LinkList<T> : IMyList<T>    {        private MyNode<T> headNode;//头结点        public LinkList()        {            headNode = null; //headNode为空表示这个单链表是空的        }        public int GetLength()        {            if (headNode == null) return 0;            else            {                MyNode<T> temp = headNode;                int count = 1;                while (true)                {                    if (temp.Next == null)                    {                        break;                    }                    count++;                    temp = temp.Next;                }                return count;            }        }        public void Clear()        {            headNode = null;        }        public bool IsEmpty()        {            if (headNode == null) return true;            else            {                return false;            }        }        public void Add(T item)        {            MyNode<T> temp = new MyNode<T>(item);//存储添加的元素            if (headNode == null)            {                headNode = temp;//  此时count=1,有一个元素            }            else            {               MyNode<T> pNode = headNode;               while (true)                {                    if (pNode.Next == null)                    {                        headNode.Next = temp;                        break;//否则会报错,nullexcpation当你访问null的对象                    }                   pNode = pNode.Next;                }                pNode.Next = temp;            }        }        public void Insert(T item, int index)//要约束index;        {            MyNode<T> tempNode=new MyNode<T>(item);            if (index==0)            {                //tempNode.Next = headNode.Next;                //headNode.Next = tempNode;也可以使用这个                tempNode = headNode;                headNode.Next = tempNode;            }            else            {                   if(index>=GetLength()) throw new IndexOutOfRangeException("索引超出异常");                    MyNode<T> currentNode = headNode;                    for (int i = 1; i <= index; i++)                    {                        if (currentNode.Next == null)//说明current显示在尾结点                        {                            currentNode.Next = tempNode;                            break;                        }                        currentNode = currentNode.Next;                    }                    tempNode.Next = currentNode.Next;                    currentNode.Next = tempNode;                                            }        }        public T Delete(int index)        {            T a;            if (IsEmpty()) throw new Exception("为空还操作你妹");//表示为空不能删            if (index == 0)//删除了head结点,head 向后移            {                a = headNode.Data;                headNode = headNode.Next;                         }            else            {                if (index >= GetLength()) throw new IndexOutOfRangeException("索引超出异常");                MyNode<T> currentNode = headNode;                for (int i = 1; i <= index - 1; i++)                {                    if (currentNode.Next.Next == null)//说明current到达尾结点                    {                        a = currentNode.Next.Data;                        currentNode.Next = null;                        return a;                    }                    currentNode = currentNode.Next;                }                a = currentNode.Next.Data;                currentNode.Next = currentNode.Next.Next;                          }            return a;        }        public T GetElement(int index)        {            T a;            if (IsEmpty()) throw new Exception("为空还操作你妹");//表示为空不能操作            if (index == 0)//删除了head结点,head 向后移            {                a = headNode.Data;                          }            else            {                if (index >= GetLength()) throw new IndexOutOfRangeException("索引超出异常");                MyNode<T> currentNode = headNode;                for (int i = 1; i <= index - 1; i++)                {                    if (currentNode.Next.Next == null)//说明current到达尾结点                    {                       break;                                                               }                    currentNode = currentNode.Next;                }                a = currentNode.Next.Data;                       }            return a;        }        public void ShowData()        {            MyNode<T> temp = headNode;            while (true)            {                Console.Write(temp.Data+"\t");                if (temp.Next == null)                {                    break;                }                temp = temp.Next;            }        }    }

双向链表和循环链表

1.双向链表  就是 有一个前地址和后地址

2.循环链表就是 尾结点指向头结点 ,当头结点头尾相连就是空表