using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; /*
使用 约束 实现可排序单链表
*/
namespace UsingConstraints
{
class Employee : IComparable<Employee>
{
private string name;
public Employee(string name)
{
this.name = name;
}
public override string ToString()
{
return this.name;
} //实现接口
public int CompareTo(Employee rhs)
{
return this.name.CompareTo(rhs.name);
}
public bool Equal(Employee rhs)
{
return this.name == rhs.name;
}
} //结点必须实现T的Node的IComparable
//使用关键字where
//约束Node只能接受实现了IComparable接口的项
public class Node<T> : IComparable<Node<T>> where T : IComparable<T>
{
private T data;
private Node<T> next = null;
private Node<T> prev = null;
//构造方法
public Node(T data)
{
this.data = data;
} //属性
public T Data { get { return this.data; } } public Node<T> Next { get { return this.next; } } public int CompareTo(Node<T> rhs)
{
//存在约束,所以可行
return data.CompareTo(rhs.data);
} public bool Equals(Node<T> rhs)
{
return this.data.Equals(rhs.data);
} public Node<T> Add(Node<T> newNode)
{
if (this.CompareTo(newNode) > 0) //在我之前
{
newNode.next = this; //如果前面有结点,将它设为新结点,作为后续
if (this.prev != null)
{
this.prev.next = newNode;
newNode.prev = this.prev;
}
//当前结点prev指向新结点
this.prev = newNode;
//返回newNode,如果它是新的头结点
return newNode;
}
else //在我之后
{
//如果后面还有结点,一同传递比较
if (this.next != null)
{
this.next.Add(newNode);
}
//没有后续结点了,将新结点作为后续结点
else
{
this.next = newNode;
newNode.prev = this;
}
return this;
}
} public override string ToString()
{
string output = data.ToString();
if (next != null)
{
output += ", " + next.ToString();
}
return output;
} } class LinkedList<T> where T : IComparable<T>
{
private Node<T> headNode = null;
//属性索引器
public T this[int index]
{
get
{
int ctr = 0; Node<T> node = headNode; while(node != null && ctr<=index)
{
if (ctr == index)
{
return node.Data;
}
else
{
node = node.Next;
}
++ctr;
}
throw new ArgumentOutOfRangeException();
}
} public LinkedList()
{
} public void Add(T data)
{
if (headNode == null)
{
headNode = new Node<T>(data);
}
else
{
headNode = headNode.Add(new Node<T>(data));
}
} public override string ToString()
{
if (this.headNode != null)
{
return this.headNode.ToString();
}
else
{
return string.Empty;
}
}
} class Program
{
static void Main(string[] args)
{
Program pg = new Program();
pg.Run();
} public void Run()
{
LinkedList<int> myLinkedList = new LinkedList<int>();
Random rand =new Random();
Console.Write("Adding: ");
for(int i=0;i<10;i++)
{
int nextInt = rand.Next(10);
Console.Write("{0} ",nextInt);
myLinkedList.Add(nextInt);
}
Console.WriteLine();
Console.WriteLine("Integer: "+myLinkedList); LinkedList<Employee> empLinkedList = new LinkedList<Employee>();
empLinkedList.Add(new Employee("John"));
empLinkedList.Add(new Employee("Wang"));
empLinkedList.Add(new Employee("Lee"));
//按顺序排序后显示
Console.WriteLine("class: " + empLinkedList);
Console.ReadLine();
}
}
}

C#_约束 实现可排序单链表的更多相关文章

  1. leetcode题解: Remove Duplicates from Sorted List(已排序单链表去重)

    题目: Given a sorted linked list, delete all duplicates such that each element appear only once. For e ...

  2. Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

    直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:

  3. Linux C 单链表 读取文件 并排序 实例并解释

    C的指针挺头疼的,先看一个例子: 给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解.谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值:    如果没有使用解引用操作, ...

  4. 148. Sort List (java 给单链表排序)

    题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn) ...

  5. 含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)

    温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助! #include<iostream> using namespace std; typedef s ...

  6. Leetcode23--->Merge K sorted Lists(合并k个排序的单链表)

    题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后 ...

  7. Leetcode21--->Merge Two Sorted Lists(合并两个排序的单链表)

    题目: 给出两个排序的单链表,合并两个单链表,返回合并后的结果: 解题思路: 解法还是很简单的,但是需要注意以下几点: 1.  如果两个链表都空,则返回null; 2.  如果链表1空,则返回链表2的 ...

  8. java实现单链表的增删改以及排序

    使用java代码模拟单链表的增删改以及排序功能 代码如下: package com.seizedays.linked_list; public class SingleLinkedListDemo { ...

  9. 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)

    目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...

随机推荐

  1. 剑指Offer:打印从1到最大的n位数

    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...

  2. win10+vs2013+Qt5.4 安装方法

    环境:win10 cn_visual_studio_ultimate_2013_x86_dvd_3009109 qt-opensource-windows-x86-msvc2013_64_opengl ...

  3. 2.1CUDA-Thread

    在HOST端我们会分配block的dimension, grid的dimension.但是对应到实际的硬件是如何执行这些硬件的呢? 如下图: lanuch kernel 执行一个grid. 一个Gri ...

  4. 【解决】国内访问github过慢

    github在国内慢的有点不能忍了,受不了了google了一下有什么方法没,还真找到一些方法. 死马当活马医,操作完之后确实速度上快了一些,但是毕竟国情所限,仍然做不到“秒开”. 主要是参考两篇博客: ...

  5. HDU-4642 Fliping game 简单博弈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4642 看右下角的状态就行了,因为上面的操作每次都会改变它,而最后的局势是根据它来的... //STAT ...

  6. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

  7. hdu4435-charge-station(搜索+贪心)

    题意&题解: http://www.cnblogs.com/wuminye/p/3245546.html 说实话看了题解觉得很简单,但是比赛的时候真的是毫无头绪. 然而印象中做过一道类似的二进 ...

  8. [C++]VS2010功能设置

    VS2010快捷键设置 工具->选项->环境->键盘->[显示命令包含] 下面输入“对齐”关键字->窗口显示关于“对齐”的所有操作命令->选中“某一个”->[ ...

  9. hdoj 5500 Reorder the Books

    Reorder the Books Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  10. 转载MVC Html.AntiForgeryToken() 防止CSRF攻击

    MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross ...