c# 约瑟夫环问题

最近我们数据结构课上,要求用c#编写约瑟夫环的循环链表算法。研究了很久,最终得出了结果!现在就把我的成果和大家分享一下吧。。。

首先还是要建立节点的类。该类的代码可以如下:

class LinkNode<T> { T data;//存放数据 LinkNode<T> next;//指向下一个节点的引用 //无参数构造 public LinkNode() { this.data = default(T); this.next = null; } // 给出数据的额构造器 public LinkNode(T e) { this.data = e; this.next = null; } //只给出节点的构造 public LinkNode(LinkNode<T> p) { this.next = p; } //给出节点和数据的构造 public LinkNode(T e, LinkNode<T> p) { this.data = e; this.next = p; } // 数据属性 public T Data { get { return data; } set { data = value; } } //引用属性 public LinkNode<T> Next { get { return next; } set { next = value; } } }

然后建立链表的类:

class LinkList<T> { public LinkNode<T> head;//表头 public LinkNode<T> Head { get { return head; } set { head = value; } }//表头属性 public LinkList()//构造空表 { } // 表尾添加e public void append(T e) { LinkNode<T> s = new LinkNode<T>(e); LinkNode<T> p = new LinkNode<T>(); if (head == null) { head = s; s.Next = head; return; } p = head; while (p.Next != head)//p后移到表尾 { p = p.Next; } p.Next = s; s.Next = head;//首位相连构成链表 } public int GetLength() //获得表长 { LinkNode<T> p = head; int len = 0; if (p == null) { return len; } else { len = len + 1; } while (p.Next != head) { len++; p = p.Next; } return len; } public bool IsEmpty()//是否为空 { if (head == null) { return true; } else { return false; } } public bool InsertNode(int i, T e)//插入某一元素 { LinkNode<T> p = Locate(i – 1); if (p != null) { LinkNode<T> s = new LinkNode<T>(e); s.Next = p.Next; p.Next = s; return true; } else return false; } public LinkNode<T> Locate(int i)//已知该节点的节点数,寻找该节点 { if (IsEmpty()) { return null; } if (i > 0 && i > GetLength()) { return null; } LinkNode<T> p = head; int j = 1; while (p != null && j < i) { j++; p = p.Next; } if (j == i) { return p; } else return null; } public LinkNode<T> Locate(T x)//已知节点数值,查找该节点 { if (IsEmpty()) { return null; } LinkNode<T> p = head; while (p != null && !p.Data.Equals (x)) { p = p.Next; } if (p.Data.Equals(x)) return p; else return null; } public T GetElement(int i) { LinkNode<T> p = Locate(i); if (p == null) { return default(T); } else { return p.Data; } } public LinkNode<T> Delete(int i, int len)//已知该节点的位置和总链长,删除该节点 { if (i > 1) { LinkNode<T> p = Locate((i – 1)); LinkNode<T> q = new LinkNode<T>(); q = p.Next; p.Next = q.Next; return q; } else { LinkNode<T> p = Locate(len); LinkNode<T> q = new LinkNode<T>(); q = p.Next; p.Next = q.Next; head = p.Next; return q; } } public int Loca(T x)//查询节点数值为x的节点的位置 { int t=1; if (IsEmpty()) { return 0; } LinkNode<T> p = head; while (p != null && !p.Data.Equals(x)) { p = p.Next; t++; } if (p.Data.Equals(x)) return t; else return 0; } public LinkNode<T> Delete(LinkNode<T> p)//删除节点p { if (p != null) { LinkNode<T> q = p.Next; p.Next = q.Next; return q; } else { return null; } } }

最终是我们的main函数的代码了

static void Main(string[] args) { Console.WriteLine(“请输入人的总数:”); int len = int.Parse(Console.ReadLine());//获取总人数 LinkList<int> Johnseff = new LinkList<int>(); LinkNode<int> Del = new LinkNode<int>();//删除节点名称 LinkNode<int> start = new LinkNode<int>();//获取起始地址节点 for (int i = 1; i <= len; i++) { Johnseff.append(i);//构造循环链表 } Console.WriteLine(“请输入起始位置:”); int Startnum = int.Parse(Console.ReadLine());//获取起始位置 Console.WriteLine(“请输入间隔数字:”); int Alter = int.Parse(Console.ReadLine());//获取间隔数字 start = Johnseff.Locate(Startnum ); while (Johnseff.GetLength() > 0) { for (int i = 1; i < Alter; i++) { start = start.Next; } Del = start; start = start.Next; int s; s = Johnseff.Loca(Del.Data); if (Johnseff.GetLength() == 1) { Console.WriteLine(“最后剩下:” + Johnseff.Locate(1).Data);//剩下最后元素 break; } else { Console.WriteLine(“删除” + Johnseff.Delete(s, Johnseff.GetLength()).Data); } Console.Read(); } } 

呵呵,这样最终完成了。。。。

当输入人数41,开始数字1,间隔数3时,结果31.。。正确!

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/ahmczhangtao/article/details/5633723
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞