題目描述
[問題描述]
將若干城市的信息,存入一個帶頭結點的單鏈表。結點中的城市信息包括:城市名,城市的位置座標。要求能夠利用城市名和位置座標進行有關查找、插入、刪除、更新等操作。
[基本要求]
(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;
}
}
}