题目描述
[问题描述]
将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
[基本要求]
(1) 给定一个城市名,返回其位置坐标;
(2) 给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
效果图:
过程实现
首先定义一个结点 ,包括数据Data,指针Next
//定义每个结点
public class SNode<T> where T : IComparable<T>
{
//定义数据部分(属性)
public T Data { get; set; }
//后继结点指针部分(属性)
public SNode<T> Next { get; set; }
//无后继指针方法,构造函数
public SNode(T data)
{
Data = data;
Next = null;
}
//有后继指针方法,构造函数
public SNode(T data, SNode<T> next)
{
Data = data;
Next = next;
}
}
对单链表进行封装,单链表遍历
创建一个CityData封装城市信息包括城市得名称与坐标
最后创建窗体
窗体样本
运行效果图
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataStruct
{
//定义每个结点
public class SNode<T> where T : IComparable<T>
{
//定义数据部分(属性)
public T Data { get; set; }
//后继结点指针部分(属性)
public SNode<T> Next { get; set; }
//无后继指针方法,构造函数
public SNode(T data)
{
Data = data;
Next = null;
}
//有后继指针方法,构造函数
public SNode(T data, SNode<T> next)
{
Data = data;
Next = next;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataStruct
{
public class SLinkList<T>where T:IComparable<T>
{
//定义头指针,
public SNode<T> PHead { get; protected set; }
//记录当前链表长度
public int Length
{
get;
private set;
}
//构造函数
public SLinkList()
{
Length = 0;
PHead = null;
}
//头插
//头指针指向新生成的结点
public void InsertAtFirst(T data)
{
PHead = new SNode<T>(data, PHead);
Length++;
}
//获取目标位置的数据
public SNode<T> Locade(int index)
{
if (index < 0 || index > Length - 1)
{
throw new IndexOutOfRangeException();
}
//使用temp指向最开始的头,来遍历链表,需返回指定位置的数据
SNode<T> temp = PHead;
for (int i = 0; i < index; i++)
{
temp = temp.Next;
}
return temp;
}
//尾插法
public void InserAtRear(T data)
{
if (PHead == null)
PHead = new SNode<T>(data);
else
Locade(Length - 1).Next = new SNode<T>(data);
Length++;
}
//清空数据
public void Clear(int index)
{
PHead = null;
Length = 0;
}
//索引器
public T this[int index]
{
get
{
if (index < 0 || index > Length - 1)
{
throw new IndexOutOfRangeException();
}
return Locade(index).Data;
}
set
{
if (index < 0 || index > Length - 1)
{
throw new IndexOutOfRangeException();
}
Locade(index).Data = value;
}
}
//判断为空
public bool IsEmpty()
{
return (Length == 0);
}
//插入
public void Insert(int index, T data)
{
if (index < 0 || index > Length - 1)
{
throw new IndexOutOfRangeException();
}
if (index==0)
InsertAtFirst(data);
else if (index == Length)
InserAtRear(data);
else
{
Locade(index - 1).Next = new SNode<T>(data, Locade(index));
Length++;
}
}
//移除
public void Remove(int index)
{
if (index < 0 || index > Length - 1)
{
throw new IndexOutOfRangeException();
}
//删除头结点
if (index == 0)
PHead = PHead.Next;
else
Locade(index - 1).Next = Locade(index).Next;
Length--;
}
public int Search(T data) //已知数据,得到它在链表中的位置
{
SNode<T> temp = PHead;
int i = 0;
for (; i < Length; i++)
{
if (temp.Data.CompareTo(data) == 0)
break;
temp = temp.Next;
}
return i == Length ? -1 : i;
}
}
}