单链表的思考

C#泛型单链表实现

我首先用list实现一个单链表

 class nodes
    {
        private string value;
        private nodes node;
        string result = "";
        public nodes(string value):this(value,null)
        {
            this.value = value;
        }

        public nodes(string value,nodes node)
        {
            this.value = value;
            this.node = node;
        }

        public override string ToString()
        {
            return value.ToString()+(node==null?"":node.ToString());
        }
      
    }

 static void Main(string[] args)
        {
            //单链表
         nodes n1 = new nodes("1");
            nodes n2 = new nodes("2", n1);
            nodes n3 = new nodes("3", n2);

            Console.WriteLine(n3);
            Console.ReadKey();
        }

结果:321 ok
当然我们也可以用范型!将Node改为Node<T>即可, nodes n1 = new nodes("1");也改为 nodes<char> n1 = new nodes<char>("1");

  现在的问题是:上面的代码我只能传同一种类型的值,要是我想传不同类型的值改怎么办呢!

   显然我们可以通过 ,private object value;将所有输入的值都设成object类型。

这种方法可以,但是难免会带来不断的装箱和拆箱!

 

internal class baseNode
    {
        protected baseNode bNode;
        public baseNode(baseNode bNode)
        {
           this.bNode = bNode;
        }
    }

    class childNode<T>:baseNode
    {
        T value;
        
        public childNode(T value):this(value,null){}

        public childNode(T value,baseNode bnode): base(bnode)
        {
            this.value = value;
        }

        public override string ToString()
        {
            return value + ( bNode== null ? "" : bNode.ToString());
        }
    
    }

两种实现方法:
           //单链表
            childNode<string> n1 = new childNode<string>("1");
            childNode<string> n2 = new childNode<string>("2", n1);
            childNode<int> n3 = new childNode<int>(3, n2);
 
            baseNode head = new childNode<string>("1");
            head = new childNode<string>("2",head);
            head = new childNode<int>(3,head);
 
            Console.WriteLine(n3);
            Console.WriteLine(head);

  

 

 

转载于:https://www.cnblogs.com/fjsnail/p/3254220.html

<think>好的,我需要回答用户关于单链表LNode定义和实现的问题。首先,用户提供了多个引用资料,我需要仔细查看这些资料来确保回答的准确性。 首先,引用[1]、[3]、[4]、[5]都提到了单链表的定义。根据引用[1]和[3],LNode的结构体定义包括数据域data和指向下一个节点的指针next。引用[4]对比了顺序表和单链表,指出单链表的存储结构是链式存储,每个节点包含数据和指针。引用[5]给出了具体的代码示例,其中typedef struct LNode定义,并使用了LinkList作为指向结构体的指针类型。 接下来,我需要组织回答的结构。用户要求结构清晰,逐步解决问题,并引用正确的资料。首先,应该解释单链表的定义,包括结构体的各个部分。然后,展示代码实现,包括初始化、插入、删除等基本操作。最后,生成相关问题。 在引用资料时,需要正确标注来源。例如,结构体定义来自引用[1]和[3],初始化和操作代码可能参考引用[2]和[5]。要注意区分指针变量和节点变量的概念,如引用[2]提到的。 还需要检查LaTeX格式是否正确,所有行内公式用$...$,独立公式用$$...$$。例如,链表的存储结构可能需要用代码块展示,而不是公式,所以这里可能不需要数学表达式。 最后,生成的相关问题要围绕单链表的应用、操作复杂度、对比顺序表等,确保问题主题相关,并基于提供的引用资料。 现在,我需要将以上思考整理成一个连贯的回答,确保引用正确,代码示例正确,并且符合用户的格式要求。</think>### 单链表LNode的定义实现 #### 1. 单链表LNode的定义 单链表是一种链式存储结构,每个节点(`LNode`)包含两部分: - **数据域**:存储元素值,例如`int data`或`ElemType data` - **指针域**:指向下一个节点的地址,例如`struct LNode *next` 其C语言定义如下(引用[1][3][4]): ```c typedef struct LNode { ElemType data; // 数据域 struct LNode *next; // 指针域,指向下一个节点 } LNode, *LinkList; // LNode表示节点,LinkList表示头指针类型 ``` - **`LNode`**:表示单个节点的结构体类型 - **`LinkList`**:指向头节点的指针类型,用于表示整个链表[^3][^4] #### 2. 单链表的实现 ##### (1) 初始化空链表 ```c LinkList CreateList() { LinkList L = (LinkList)malloc(sizeof(LNode)); // 分配头节点空间 L->next = NULL; // 头节点指针域置空 return L; // 返回头指针 } ``` (引用[5]) ##### (2) 插入节点(在第$i$个位置前插入) ```c Status ListInsert(LinkList L, int i, ElemType e) { LinkList p = L; int j = 0; while (p && j < i-1) { // 找到第$i-1$个节点 p = p->next; j++; } if (!p || j > i-1) return ERROR; // 位置不合法 LNode *s = (LNode*)malloc(sizeof(LNode)); s->data = e; // 新节点赋值 s->next = p->next; // 新节点指向原第$i$个节点 p->next = s; // 原第$i-1$个节点指向新节点 return OK; } ``` (引用[2][4]) ##### (3) 删除节点(删除第$i$个节点) ```c Status ListDelete(LinkList L, int i, ElemType *e) { LinkList p = L; int j = 0; while (p->next && j < i-1) { // 找到第$i-1$个节点 p = p->next; j++; } if (!(p->next) || j > i-1) return ERROR; // 位置不合法 LNode *q = p->next; // 临时保存待删除节点 *e = q->data; // 返回被删除元素的值 p->next = q->next; // 绕过待删除节点 free(q); // 释放内存 return OK; } ``` (引用[2][4]) #### 3. 单链表的特性 - **优点**:无需连续存储空间,动态分配内存更灵活[^4] - **缺点**:无法随机存取,查找时间复杂度为$O(n)$[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值