C# 链表操作

关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作。

这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实现了自定义链表的操作(读者可以在此基础上进一步完善)。因为这段代码涉及一些C#技巧,所以贴出来给初学者学习C#提供一点参考。

实体类:

    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Student(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public override string ToString()
        {
            return "\r\n" + this.Name + ":年龄" + this.Age + "岁";
        }
    }

链表节点类:

    /// <summary>
    /// 节点类
    /// </summary>
    /// <typeparam name="T">泛型</typeparam>
    public class Node<T>
    {
        public T Data { get; set; }
        public Node<T> Next { get; set; }

        public Node(T data)
        {
            this.Data = data;
            this.Next = null;
        }

        /// <summary>
        /// 附加节点
        /// </summary>
        /// <param name="newNode">新的节点</param>
        public void Append(Node<T> newNode)
        {
            //如果下一节点为null,则将新的节点指向下一节点
            if (this.Next == null)
            {
                this.Next = newNode;
            }
            //如果下一节点不为null,则直接附加到下一节点
            else
            {
                this.Next.Append(newNode);
            }
        }

        public override string ToString()
        {
            string output = this.Data.ToString();
            if (this.Next != null)
            {
                output += " " + this.Next.ToString();
            }
            return output;
        }
    }

链表类:

    /// <summary>
    /// 链表类
    /// </summary>
    /// <typeparam name="T">泛型</typeparam>
    public class LinkedList<T>
    {
        Node<T> headNode = null;//头节点

        /// <summary>
        /// 追加节点方法
        /// </summary>
        /// <param name="data"></param>
        public void Add(T data)
        {
            if (headNode == null)
            {
                headNode = new Node<T>(data);
            }
            else
            {
                headNode.Append(new Node<T>(data));
            }
        }

        /// <summary>
        /// 索引器,通过索引获取节点
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public T this[int index]
        {
            get
            {
                int temp = 0;
                Node<T> node = headNode;

                while (node != null && temp <= index)
                {
                    if (temp == index)
                    {
                        return node.Data;
                    }
                    else
                    {
                        node = node.Next;
                    }
                    temp++;
                }
                return default(T);
            }
        }

        public override string ToString()
        {
            if (headNode != null)
            {
                return this.headNode.ToString();
            }
            return string.Empty;
        }
    }

主函数:

    class Program
    {
        static void Main(string[] args)
        {
            LinkedList<int> intList = new LinkedList<int>();
            Enumerable.Range(0, 5).ToList<int>().ForEach(x => intList.Add(x));
            Console.WriteLine("整型的内容为:{0}\r\n", intList);

            LinkedList<Student> students = new LinkedList<Student>();
            students.Add(new Student("张三", 20));
            students.Add(new Student("李四", 22));
            students.Add(new Student("王五", 21));
            Console.WriteLine(students[1].Name + "的年龄为:" + students[1].Age);

            Console.ReadLine();
        }
    }

最后附录一下微软官方的链表类。https://msdn.microsoft.com/zh-cn/library/he2s3bh7(v=vs.110).aspx

时间: 2024-08-05 02:40:46

C# 链表操作的相关文章

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

单链表操作

#include<stdio.h>#include<malloc.h> typedef struct Node{ int data; struct Node *next;}LinkList; //就地反转int LinkListRerverse(LinkList *head){ LinkList *q,*p; p = head->next; head->next = NULL; while(p != NULL){ q = p->next; p->next =

数据结构之链表操作

#include <IOSTREAM> #include <IOMANIP> #include <STRING> using namespace std; typedef struct Student { int id; char name[20]; char sex[20]; struct Student *next; }node; typedef node * pnode; pnode Create(); void Print(pnode h); void Sort

单向链表操作 原文:http://canlynet.blog.163.com/blog/static/255013652009113001041903/

/********************************************** 功能:单向链表操作(注意Head指针 需要被改变时传入的是二级指针) 日期:2009.12.29 作者:DC ***********************************************/ #include <stdio.h> #include <stdlib.h> #define OVER_FLOW -2 #define OK 0 typedef int ElemTy

单链表操作系列

#include<stdio.h> #include<stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //单链表的建立1,头插法建立单链表,逆序生成 LinkList LinkListCreateH() { LinkList L,p; L = (LinkList)malloc(sizeof(LNode)

链表操作 -- 有环链表问题

参考: http://blog.163.com/[email protected]/blog/static/1113522592011828104617420/ 问题: 判断一个链表中是否有环. 分析: 我们都知道,当一个链表中没有环时,我们使用一个指针能从头遍历到尾:当链表中有环时,链表会在环中旋转. 当我们只使用一个链表指针时,可想到方法就是使用额外的数据结构来存储遍历过的每个节点,在遍历next节点时,判断next节点是否已存在于存储的节点中. 存储结构可以选择为hashTable,这样的

链表操作 -- 问题总结贴

本文同时收集了好友 sosohu 和 zhuoyuan 的文章,共同进步.欢迎指正. 链表结构的实现: -- zhouyuan 单链表操作: (1). 倒序访问 --  sosohu (2). 获取链表的倒数第K个元素 -- sosohu    zhouyuan carlsama (3). 查找链表的中间节点 -- sosohu  carlsama (4). 链表反转 -- sosohu zhuoyuan carlsama (5). 链表中节点的删除 -- sosohu  carlsama (6

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

【数据结构与算法】java链表操作

链表操作代码量少但是比较容易出错,是比较适合面试的地方. 代码实现 /** * 源码名称:MyLinkList.java * 日期:2014-09-05 * 程序功能:java链表操作 * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class MyLinkList { class LinkNode<T> { private T mValue; private LinkNode<T> mNe