数据结构----城市链表

题目描述

[问题描述]
将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。
[基本要求]
(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;
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了47 篇原创文章 · 获赞 5 · 访问量 1894

猜你喜欢

转载自blog.csdn.net/Pang_ling/article/details/104764796
今日推荐