[数据结构]之链表

[数据结构]之链表
##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)
		}
	
	}

posted @ 2013-04-17 17:06  零界寒冰  阅读(117)  评论(0编辑  收藏  举报