标签:
/*
创建链表,通过使用节点类来创建
*/
using System;
class Node
{
public int data; //data用来存放节点的数据
public Node next; //next(节点对象)用来存放下一个节点的地址
}
class CreateList
{
private Node start; //头指针存放第一个节点的地址.
private Node current; //定义个当前节点对象,用来遍历链表.
private Node previous; //前驱节点.
public CreateList()
{
start=null; //当初始化类时,设置头指针为空
}
/*优化的创建链表的方法*/
public void create2()
{
previous=current=start=null; //最开始的时候都为空,就是链表为一个空链表.
Console.Write("请输入您要创建链表的个数:");
int k=Convert.ToInt32(Console.ReadLine());
for(int i=0;i<k;i++)
{
Console.Write("请输入您要插入的第"+(i+1).ToString()+"节点数据:");
current=new Node();
current.data=Convert.ToInt32(Console.ReadLine());
if(start==null)
start=current;
else
previous.next=current;
previous=current;
}
}
public void create() //创建链表的方法:笨蛋方法(最为朴素的方法)
{ Node first=null;
if(start==null)
{
first=new Node(); //1.分配内存
Console.Write("请输入第一个节点值:");
first.data=Convert.ToInt32(Console.ReadLine()); //2.设定数据域里面的数据为2
first.next=null; //3.设定地址域里面的地址为null
start=first; //4.建链接
current=first; //当前节点为第一个节点.
}
//------------------添加质数为3的节点
Node second=new Node(); //1。分配内存
Console.Write("请输入第二个节点值");
second.data=Convert.ToInt32(Console.ReadLine()); //2.设数据
second.next=null; //3.设地址
first.next=second; //4.将第一个节点指向第二个节点
//---------------------
Node third=new Node(); //1。分配内存
Console.Write("请输入第3个节点值");
third.data=Convert.ToInt32(Console.ReadLine()); //2.设数据
third.next=null; //3.设地址
second.next=third; //4.将第2个节点指向第3个节点
//---------------------------
Node fourth=new Node(); //1。分配内存
Console.Write("请输入第4个节点值");
fourth.data=Convert.ToInt32(Console.ReadLine()); //2.设数据
fourth.next=null; //3.设地址
third.next=fourth; //4.将第3个节点指向第4个节点
//-------------------------
Node fifth=new Node(); //1。分配内存
Console.Write("请输入第5个节点值");
fifth.data=Convert.ToInt32(Console.ReadLine()); //2.设数据
fifth.next=null; //3.设地址
fourth.next=fifth; //4.将第4个节点指向第5个节点
}//创建结束
public void scan() //遍历链表的方法
{
current=start; //从头指针开始
int i=1;
while(current!=null)
{
Console.WriteLine("第"+i+"个节点数据为:"+current.data);
current=current.next; //将当前节点的下一个节点的地址给current,以便current去访问下一个节点.
i++;
}
}
//插入新节点
public void insert()
{
Console.WriteLine("请输入您要插入的新节点数据");
int i=Convert.ToInt32(Console.ReadLine());
Node newnode=new Node();
newnode.data=i;
/*判断新节点是否为空,并且链表当中没有该节点:在头节点之前插入*/
if((start==null)||(i<=start.data))
{
if((start!=null)&&(i==start.data))
{
Console.WriteLine("\n重复节点不允许");
return;
}
newnode.next=start;
start=newnode;
return;
}
/*在列表中间插入*/
previous=current=start; //设置为开始头节点
while((current!=null)&&(i>=current.data))
{
if(i==current.data)
{
Console.WriteLine("\n重复数据不允许");
return;
}
previous=current;
current=current.next;
}
/*找到前驱节点和后继节点之后*/
newnode.next=current;
previous.next=newnode;
}
//搜索链表元素
public void search()
{
Console.WriteLine("请输入您要查找的数据:");
int i=Convert.ToInt32(Console.ReadLine()); //1.定义一个要搜索的数字
Node current=start; //2.定义当前节点对象current
while((current!=null)&&(current.data!=i)) //3.如果当前节点不为空,并且当前节点数据不等于你输入的数据,则循环.
{
current=current.next;
}
//4。判断是找到了还是没有找到
if(current==null)
Console.WriteLine("没有找到");
else
Console.WriteLine("已经找到了您输入的数据");
}
//删除链表元素
public void delete()
{
Console.WriteLine("请输入您要删除的元素");
int i=Convert.ToInt32(Console.ReadLine());
previous=current=start; //设定当前节点为头指针指向的节点.
if(start==null)
{
Console.WriteLine("吃饱了撑的,开始乱删了,滚!XXXXXXXX");
}else if(current.data==i)
{
start=current.next;
current.next=null; //书上忽略了,由系统自动回收不用的内存.
}else //否则,有多个节点,要删除我们指定的节点.
{
while((current!=null)&&(current.data!=i))
{//要找下一个符合条件的节点
previous=current; //在找符合要求的节点之前,将原来节点的地址给previous
current=current.next; //当前节点指向下一个节点.
}
if(current==null)
Console.WriteLine("没有找到!");
else
previous.next=current.next; //将要删除的节点的后继节点地址给前驱节点的next.
}
}
/*
1.定义要删除节点的前驱节点对象:previous;要删除节点:current
2.previous和current都指向start
3.遍历链表,以便找到要删除的节点.到底什么时候遍历链表呢?
while(current!=null)并且(current.data!=17)
{
previous=current;
current=current.next; // 要查找下一个节点,同时,前驱节点指向刚才的current节点.
}
如果current==空:null
说明没有找到
else
找到了则: previous.next=current.next;
*/
public static void Main(string[]args)
{
CreateList list=new CreateList();
//list.create2(); //创建链表
list.scan();
list.insert();
list.delete();
list.scan();
//list.search();
}
}/*
针对链表为空的时候进行插入一个节点的实现;
链表的实现通过节点类来实现.
*/
using System;
class Node //定义一个节点类
{
public int data; //数据
public Node next; //next:存放下一个节点的地址.
}
//定义实现对节点操作的类
class LinkedListInsert
{
//定义一个头指针的属性
private Node Start;
private Node current; //当前节点.
//定义构造方法
public LinkedListInsert()
{
Start=null;
}
//定义一个静态插入方法
public void insert()
{ //直接赋值
if(Start==null)
{
//1.第一步是给新的节点分配内存
Node first= new Node(); //分3步画图,记到本上.
//2.设置新节点的数据为2
first.data=2;
//3.将新节点(即质数为2的节点)的地址给头指针,即头指针指向质数为2的节点
Start=first;
//4.设置fist的下一个节点为空(null)
first.next=null;
//----------------------下面所实现的就应该再插入一个节点的情况;仍然按照插入第一个节点的情况步骤来做,不同点注意将新的点地址给谁了?
Node second=new Node();
second.data=3;
first.next =second; //将质数3的节点放到第一个节点地址域
second.next=null;
//-----------------------质数为5的节点
Node third=new Node();
third.data=5;
second.next=third;
third.next=null;
}
}
//浏览节点方法
public void scan()
{
//需要判断,如果节点不为空,则输出节点的数据域里的内容
current=Start;
int i=0;
while(current!=null)
{
Console.WriteLine("第{0}节点的数据为:{1}",i+1,current.data);
current=current.next;
i++;
}
}
public static void Main(string[]args)
{
LinkedListInsert list=new LinkedListInsert();
list.insert();
list.scan();
}
}/*问题描述:对单链接列表执行插入、搜索、删除和遍礼操作,该列表存储了班级中的学生记录。每个记录具有如下信息:
学生的注册号
学生的姓名
*/
using System;
using System.Text;
namespace Sort
{
/*每个节点由信息部分和到下一个节点的地址(链接)组成*/
class Node
{
public int rollNumber;
public string name;
//上面的学号和姓名为数据
public Node next; //为地址
}
class List
{
Node Start;
public List()
{
Start=null;
}
public void addNode() /*在列表中添加一个节点*/
{
int rollNo;
string sName;
Console.Write("\n请输入学生的学号:");
rollNo=Convert.ToInt32(Console.ReadLine());
Console.Write("\n请输入学生的姓名:");
sName=Console.ReadLine();
Node newNode=new Node(); //声明新节点并赋值
newNode.rollNumber=rollNo;
newNode.name=sName;
/*如果要插入的节点是第一个节点*/
if((Start==null)||(rollNo<=Start.rollNumber))
{
if((Start!=null)&&(rollNo==Start.rollNumber))
{
Console.WriteLine("\n重复的数据不允许被插入");
return;
}//不允许重复的学号.
newNode.next=Start;
Start=newNode;
return;
}
/*在列表中找到新节点的位置*/
Node previous,current; //定义我们要插入节点的前驱节点和后继节点对象.
previous=Start;
current=Start;
while((current!=null)&&(rollNo>=current.rollNumber))
{
if(rollNo==current.rollNumber)
{
Console.WriteLine("\n重复数据不允许\n");
return;
}
previous=current;
current=current.next;
}
/*一旦执行上述循环,新节点的位置就位于前一个和当前节点之间*/
newNode.next=current; //新节点指向后继节点
previous.next=newNode; //将前驱节点指向新节点.
}
/*------------------------------------------------------------------*/
public bool delNode(int rollNo) /*从列表中删除指定的节点*/
{
Node previous,current;
previous=current=null;
if(Search(rollNo,ref previous,ref current)==false) /*检查指定的节点是否在列表中*/
return false;
previous.next=current.next;
if(current==Start)
Start=Start.next;
return true;
}
public bool Search(int rollNo,ref Node previous,ref Node current) /*检查指定的节点是否在列表中*/
{
previous=Start;
current=Start;
while((current!=null)&&(rollNo!=current.rollNumber))
{
previous=current;
current=current.next;
}
if(current==null)
return (false);
else
return (true);
}
/*遍历该列表*/
public void traverse()
{
if(listEmpty())
Console.WriteLine("\n列表是空的\n");
else
{
Console.WriteLine("列表的记录是:\n");
Node currentNode;
for(currentNode=Start;currentNode!=null;currentNode=currentNode.next)
Console.Write(currentNode.rollNumber+" "+currentNode.name+"\n");
Console.WriteLine();
}
}
/*---------------------判断列表是否为空-------------------*/
public bool listEmpty()
{
if(Start==null)
return true;
else
return false;
}
/*-----------------------Main()方法--------------------*/
public static void Main(string[]args)
{
List obj=new List();
while(true)
{
try
{
Console.WriteLine("\n菜单");
Console.WriteLine("1.增加列表");
Console.WriteLine("2.删除列表");
Console.WriteLine("3.遍历列表");
Console.WriteLine("4.搜索列表");
Console.WriteLine("5.退出");
Console.Write("\n请输入您的选择(1-5):");
char ch=Convert.ToChar(Console.ReadLine());
switch(ch)
{
case '1':
obj.addNode();
break;
case '2':
{
if(obj.listEmpty())
{
Console.WriteLine("\n列表为空");
break;
}
Console.Write("\n请输入您要删除学生记录的学号:");
int rollNo=Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
if(obj.delNode(rollNo)==false)
Console.WriteLine("\n记录没有发现.");
else
Console.WriteLine("记录为"+rollNo+"已经删除");
}
break;
case '3':
obj.traverse();
break;
case '4':
{
if(obj.listEmpty()==true)
{
Console.WriteLine("\n列表为空");
break;
}
Node previous,current;
previous=current=null;
Console.Write("\n请输入您要搜索学生的学号:");
int num=Convert.ToInt32(Console.ReadLine());
if(obj.Search(num,ref previous,ref current)==false)
Console.WriteLine("\n记录没有发现.");
else
{
Console.WriteLine("\n记录发现");
Console.WriteLine("\n学号为:"+current.rollNumber);
Console.WriteLine("\n姓名:"+current.name);
}
}
break;
case '5':
return;
default:
Console.WriteLine("\n无效选项");
break;
}
}
catch(Exception e)
{
Console.WriteLine("\n请检查输入的值.");
}
}
}
}
}标签:
原文地址:http://blog.csdn.net/zhangchen124/article/details/51628380