c#链表类

using System;
using ZH.DataFrame.AbstractData;

namespace ZH.DataFrame.BasicData.ChainTable
{
    Node 单链表#region Node 单链表
    /**//// <summary>
    /// 单链表
    /// </summary>
    public class Node
    {
        public object item;
        public Node next;
        private  Node head;
        private int index;

        构造函数#region 构造函数
        public Node()
        {
            head=new Node("head");
            index=0;       
        }
        public Node(object v)
        {
            item=v;next=null;
        }
        /**//// <summary>
        /// 可以自定义开始头节点
        /// </summary>
        public void headNode()
        {
           head=new Node("head");
           index=0;
        }
        #endregion

        插入#region 插入
        /**//// <summary>
        /// 从后面插入
        /// </summary>
        /// <param name="ob">要插入的数据</param>
        public void insertNode(object ob)//从后面插入
        {
            Node x=head;
            Node t=new Node(ob);

            for(int i=0;i<index;i++)
                x=x.next;

            t.next=x.next;
            x.next=t;

            index=index+1;
        }
        /**//// <summary>
        /// 指定插入(插入指定参数的下面)l从0开始插入第一个的前面
        /// </summary>
        /// <param name="ob">要插入的数据</param>
        /// <param name="l">要插入的数据的位置</param>
        /// <returns>true为插入成功,反之失败</returns>
        public bool insertNode(object ob,int l)//指定插入(插入指定参数的下面)l从0开始插入第一个的前面
        {
            if((l>=0)&&(l<=index))
            {
                Node x=head;
                for(int i=0;i<l;i++)
                    x=x.next;

                Node t=new Node(ob);
                t.next=x.next;
                x.next=t;

                index=index+1;
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

        删除#region 删除
        /**//// <summary>
        /// 删除最后一个
        /// </summary>
        public void delNode()//删除最后一个
        {
            Node x=head;
            for(int i=0;i<index-1;i++)
                x=x.next;
            x.next=x.next.next;
            index=index-1;
        }
        /**//// <summary>
        /// 指定删除(l从1开始)
        /// </summary>
        /// <param name="l">指定删除位置</param>
        /// <returns>true删除成功,反之失败</returns>
        public bool delNode(int l)//指定删除l从1开始
        {
            if((l>0)&&(l<=index))
            {
                Node x=head;
                for(int i=0;i<l-1;i++)
                    x=x.next;
                x.next=x.next.next;
                index=index-1;
                return true;
            }           
            else
            {
                return false;
            }
        }
        /**//// <summary>
        /// 查找删除
        /// </summary>
        /// <param name="ob">输入要删除的输入</param>
        /// <returns>true删除成功,反之失败</returns>
        public bool delNode(object ob)//查找删除
        {
            Node x=head;
            Node t;
            bool b=false;
            for(int i=0;i<index;i++)
            {
               
                t=x.next;
                if(t.item==ob)
                {
                    x.next=x.next.next;
                    index=index-1;
                    b=true;
                }
                x=x.next;
            }
            return b;

        }
        #endregion

        上下移动#region 上下移动
        /**//// <summary>
        /// 上移动
        /// </summary>
        /// <param name="l">指定要移动的位置</param>
        public void Upnode(int l)
        {
            if((l>1)&&(l<=index))
            {
                object o=this.showNode(l-1);
                this.delNode(l-1);
                this.insertNode(o,l-1);
            }
        }
        /**//// <summary>
        /// 下移动
        /// </summary>
        /// <param name="l">指定要移动的位置</param>
        public void Downnode(int l)
        {
            if((l>0) && (l<index))
            {
                object o=this.showNode(l);
                this.delNode(l);
                this.insertNode(o,l);
            }
        }
        #endregion

        排序 和反链#region 排序 和反链
        /**//// <summary>
        /// 排序
        /// </summary>
        /// <param name="b">true(正)从小到大,false(反)</param>
        public void compositorNode(bool b)//排序true(正)从小到大,false(反)
        {
            if(b==true)
            {
                for(int i=1;i<index;i++)
                    for(int j=1;j<index-i+1;j++)
                      if(this.CharNode(j)>this.CharNode(j+1))
                        this.Downnode(j);                   
            }
            else
            {
                for(int i=1;i<index;i++)
                    for(int j=1;j<index-i+1;j++)
                        if(this.CharNode(j)<this.CharNode(j+1))
                           this.Downnode(j);
            }
        }
        private char CharNode(int l)
        {
           string s=this.showNode(l).ToString();
           char[] c=s.ToCharArray();
           return c[0];
        }
        /**//// <summary>
        /// 反链
        /// </summary>
        public void rollbackNode()//反链(其实是反链head后的)
        {
            Node t,y,r=null;
            y=head.next;
            while(y!=null)
            {
                t=y.next;y.next=r;r=y;y=t;
            }
            head.next=r;//把head链上最后一个

        }
        #endregion

        显示节点和接点数#region 显示节点和接点数
        /**//// <summary>
        /// 返回节点数方法
        /// </summary>
        /// <returns>节点数</returns>
        public int showNodenum()
        {
            return index;
        }
        /**//// <summary>
        /// 显示指定数据
        /// </summary>
        /// <param name="l">指定位置</param>
        /// <returns>返回数据</returns>
        public object showNode(int l)//显示指定l从1开始
        {
            if((l<=index)&&(l>0))
            {
                Node x=head;
                for(int i=0;i<l;i++)
                {
                    x=x.next;
                }
                return x.item;
            }
            else
            {
                return head.item;
            }
        }
        /**//// <summary>
        /// 显示所有
        /// </summary>
        /// <returns>返回一个ObQueue对象</returns>
        public ObQueue showAllNode()//显示所有
        {
            ObQueue oq=new ObQueue();
            Node x=head;
            for(int i=0;i<index;i++)
            {
                x=x.next;
                oq.qput(x.item);
            }       
            return oq;
        }
        #endregion

    }
    #endregion

    循环链表#region 循环链表
    /**//// <summary>
    /// 循环链表
    /// </summary>
    public class CircularList
    {
        public  class Node
        {
            public object val;
            public Node next;
            public Node(object v)
            {
                val=v;
            }
        }
        public Node next(Node x)
        {
            return x.next;
        }
        public object val(Node x)
        {
            return x.val;
        }
        /**//// <summary>
        /// 插入
        /// </summary>
        /// <param name="x"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public Node insert(Node x,object v)
        {
            Node t=new Node(v);
            if(x==null)t.next=t;
            else{t.next=x.next;x.next=t;}
            return t;

        }
        /**//// <summary>
        /// 移除
        /// </summary>
        /// <param name="x"></param>
        public void remove(Node x)
        {
            x.next=x.next.next;
        }
    }
    #endregion

    间接用循环链表解决,约瑟芬问题#region 间接用循环链表解决,约瑟芬问题
    /**//// <summary>
    /// 间接用循环链表解决,约瑟芬问题
    /// </summary>
    public class Josephuses
    {
        public static object GetJosephuses(object[] item,int M)
        {
            int N=item.Length;
            CircularList L=new CircularList();
            CircularList.Node x=null;
            for(int i=1;i<=N;i++)
            {
                x=L.insert(x,item[i-1]);
            }
            while(x!=L.next(x))
            {
                for(int i=1;i<M;i++)
                {
                    x=L.next(x);
                }
                L.remove(x);
            }
            return L.val(x);
        }
    }
    #endregion

    循环链表列子(约瑟芬问题)#region 循环链表列子(约瑟芬问题)
    /**//// <summary>
    /// 循环链表列子(约瑟芬问题)
    /// </summary>
    public class Josephus
    {
        public static object GetJosephus(object[] item,int M)
        {
            object[] o=item;
            int N=o.Length;
            Node t=new Node(o[0]);
            Node x=t;
            for(int i=1;i<N;i++)
            {
                x=(x.next=new Node(o[i]));
            }
            x.next=t;
            while(x!=x.next)
            {
                for(int i=1;i<M;i++)x=x.next;
                x.next=x.next.next;
            }
            return x.item;
        }
    }
    #endregion

}
 

时间: 2024-11-02 14:02:39

c#链表类的相关文章

C#数据结构篇(一链表类) killertang(原作)

C#数据结构篇(一)线性表           作者: 寒羽狼 (Dark_Slaer_Tang)             最近,马子跑了,你说女人老是容易翻脸...,看来做程序员必定要 "茕茕孑立,行影相吊"悲惨命运了.还是老老实实编程吧,我发现用c# 编一些数据接结构的类也瞒不错的,于是想把数据结构的算法,用C#重写一遍,打发无聊的时光,下面是数据结构中的链表的实现.        首先定义结点类型,定义了,前一个指针域,后一个指针域,如下: using System; names

c-C++链表类前插法与尾插法问题

问题描述 C++链表类前插法与尾插法问题 #include using namespace std; class StudentRecord { public: string stuName; int stuNo; StudentRecord(string s,int n) { stuName=s; stuNo=n; } void print() { cout<<"Name:"< } }; class StudentNode { public: StudentReco

《C++语言基础》实践项目——链表类及其应用

返回:贺老师课程教学链接 [项目 - 链表类]动态链表也是程序设计中的一种非常有用的数据结构.可以说,是否能够理解有关操作的原理,决定了你是否有资格称为"科班"出身.在后续的专业基础课中,相关的内容还会从不同的角度,反复地认识,反复地实践.不过,在现阶段多些体验,也是很有必要的了.(1)阅读下面的程序,回顾一下动态链表,阅读程序过程中,请用笔画一画形成链表的过程中指针值的变化. #include <iostream> using namespace std; struct

《C++语言基础》实践参考—— 链表类

返回:贺老师课程教学链接  项目要求 [项目 - 链表类]动态链表也是程序设计中的一种非常有用的数据结构.可以说,是否能够理解有关操作的原理,决定了你是否有资格称为"科班"出身.在后续的专业基础课中,相关的内容还会从不同的角度,反复地认识,反复地实践.不过,在现阶段多些体验,也是很有必要的了.(1)阅读下面的程序,回顾一下动态链表,阅读程序过程中,请用笔画一画形成链表的过程中指针值的变化. #include <iostream> using namespace std; s

java中的链表类的remove问题

问题描述 java中的链表类的remove问题 新人初学java,有些基本问题不是很懂,求教各位,谢谢 java中的LinkedList这个链表类中有这样一个方法,removefirst方法,含义是删除,并且返回链表的第一个元素,我想问下各位,是不是只要是删除了第一个元素,那么后面的第二个元素会顶到原来第一个元素的位置上,当我第二次调用这个方法时,相当于删除了链表的第一个元素(原来的第二个元素)? 谢谢各位了 解决方案 是的,removeFirst()方法返回链表第一个元素,并且删掉这个元素,当

C++实现的链表类实例_C 语言

本文实例讲述了C++实现的链表类.分享给大家供大家参考.具体如下: #include <iostream> using namespace std; class linklist { private: struct node { int data; node *link; }*p; public: linklist(); void append( int num ); void add_as_first( int num ); void addafter( int c, int num );

C++第15周项目2 -链表类

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/9018813 [项目2]建立专门的链表类处理有关动态链表的操作 动态链表也是程序设计中的一种非常有用的数据结构.可以说,是否能够理解有关操作的原理,决定了你是否有资格称为"科班"出身.在后续的专业基础课中,相关的内容还会从不同的角度,反复地认识,反复地

20120918-双向链表类定义《数据结构与算法分析》

将新的节点插入双向链表的时候: iterator insert(iterator itr,const Object & x)//向双向链表中插入一个x节点 { Node *p = itr.current; theSize++; return iterator(p->prev = p->prev->next = new Node(x,p->prev,p)); } LIST类的删除节点的过程: //删除双向链表中的一个节点 iterator erase(iterator itr

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s