zoukankan      html  css  js  c++  java
  • [数据结构]之链表

    [数据结构]之链表
    ##1 描述
    链表:对于当前链表中元素,除了存储本身的值,还存储有指示后面元素的地址(通常是指针或引用)。
    
    节点:每一个链表的元素称为一个节点。
    
    
    ##2 数据结构
    节点Node,链表Linklist
    
    1)节点属性
    
    存储的数据  data
    
    指向下一元素的指针 next
    
    2)链表属性
    
    链表的起始节点  begin
    
    当前长度 
    
    3)操作
    Get(index)获取元素
    
    Insert(index,elem) 插入元素
    
    Delete(index)	删除第i个元素
    
    
    ##3 go语言实现
    	package main
    	
    	import (
    		"fmt"
    	)
    	
    	/*
    	 *	定义节点
    	 */
    	type Node struct {
    		Data string
    		Next *Node
    	}
    	
    	/*
    	 *	定义链表
    	 */
    	type LinkList struct {
    		Begin  *Node
    		Length int
    	}
    	
    	/*
    	 *	获取顺序表的第index元素
    	 */
    	func (list *LinkList) Get(index int) (*Node, error) {
    	
    		if list.Length == 0 || index < 0 || index > list.Length-1 {
    			return nil, fmt.Errorf("the index %d Out Of Bounds", index)
    	
    		}
    	
    		var retElem *Node
    		retElem = list.Begin
    		//循环节点,查到下一个元素
    		for i := 1; i <= index; i++ {
    			retElem = retElem.Next
    		}
    		return retElem, nil
    	}
    	
    	/*
    	 *	插入顺序表元素,在第index位置
    	 */
    	func (list *LinkList) Insert(index int, elem *Node) error {
    	
    		if index < 0 || index > list.Length {
    			return fmt.Errorf("the index %d Out Of Bounds", index)
    		}
    		//是否插入到第一个位置
    		if index == 0 {
    			elem.Next = list.Begin
    			list.Begin = elem
    			list.Length++
    			return nil
    		}
    	
    		//修改前一节点和插入元素的指向
    		curElem, err := list.Get(index - 1)
    		if err != nil {
    			fmt.Println(err)
    			return err
    		}
    		elem.Next = curElem.Next
    		curElem.Next = elem
    		list.Length++
    		return nil
    	}
    	
    	/*
    	 *	删除顺序表元素,在第index位置
    	 */
    	func (list *LinkList) Delete(index int) error {
    		if list.Length == 0 {
    			return fmt.Errorf("the list is empty")
    		}
    		if index < 0 || index > list.Length {
    			return fmt.Errorf("the index %d Out Of Bounds", index)
    		}
    	
    		//是否删除第一个位置
    		if index == 0 {
    			list.Begin = list.Begin.Next
    			list.Length--
    			return nil
    		}
    	
    		//修改后一节点和删除元素的指向
    		curElem, err := list.Get(index - 1)
    		if err != nil {
    			fmt.Println(err)
    			return err
    		}
    		curElem.Next = curElem.Next.Next
    		list.Length--
    		return nil
    	
    	}
    	
    	func main() {
    		list := &LinkList{}
    	
    		list.Insert(0, &Node{Data: "AAAAA"})
    		list.Insert(1, &Node{Data: "BBBBB"})
    		list.Insert(2, &Node{Data: "CCCCC"})
    	
    		list.Delete(1)
    	
    		for i := 0; i < list.Length; i++ {
    			elem, _ := list.Get(i)
    			fmt.Printf("get elem %d value:%v\n", i, elem.Data)
    		}
    	
    	}
    
    
  • 相关阅读:
    VS2010 VC Project的default Include设置
    Linux 下的编辑/编译器
    用命令实现Win7远程桌面关机和重启
    怎样快速刪除Word中超链接?
    chrome浏览器世界之窗浏览器的收藏夹在哪?
    代码量查找工具[最好用的]
    C项目实践--网络协议和套接字编程
    memmove 和 memcopy
    bzoj2456: mode
    bzoj1205: [HNOI2005]星际贸易
  • 原文地址:https://www.cnblogs.com/sxt102400/p/3026627.html
Copyright © 2011-2022 走看看