數據結構----城市鏈表

題目描述

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

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章