循环链表实例GO语言实现

原创 2017年01月02日 22:56:19
package main

import (
	"fmt"
	"os"
)

type Node struct{
	data int
	pNext *Node
}

func initList() *Node{
	pHead:=new(Node)
	pHead.pNext=pHead
	return pHead   //返回头指针
}
//创建尾指针的单循环链表
func createList(list **Node){
	if !isempty(*list){
		cleanList(*list)
	}
	var val int
	p,q:=*list,*list
	fmt.Println("请输入结点数据,输入0结束输入")
	fmt.Scanf("%d",&val)
	for val!=0{
		pnew:=new(Node)
		pnew.data=val
		pnew.pNext=p
		q.pNext=pnew
		q=pnew
		fmt.Scanf("%d",&val)
	}
	*list=q
}
//清空循环链表
func cleanList(list *Node){
	if isempty(list) {
		return
	}
	phead:=list.pNext   //头结点
	p:=list.pNext.pNext //第一个结点
	q:=p
	for  p!=list.pNext  {
		q=p.pNext
		p=nil
		p=q
	}
	phead.pNext=phead
}
//插入结点
func insertList(list **Node) {
	var index,val int
	fmt.Printf("请输入要插入的位置:(值范围:1-%d)\n",listLength(*list)+1)
	fmt.Scanf("%d",&index)
	if index<1 || index>listLength(*list)+1 {
		fmt.Println("位置值越界")
		return
	}
	fmt.Println("请输入要插入的值:")
	fmt.Scanf("%d",&val)
	j:=1
	p,q:=(*list).pNext,(*list).pNext    //头结点
	for  j<index  {
		p=p.pNext
		j++
	}
	pnew:=new(Node)
	pnew.data=val
	pnew.pNext=p.pNext
	p.pNext=pnew
	if pnew.pNext==q {
		*list=pnew
	}
}

func deleList(list **Node)   {
	var index  int
	fmt.Printf("请输入要删除的位置:(值范围:1-%d)\n",listLength(*list))
	fmt.Scanf("%d",&index)
	if index<1 || index>listLength(*list) {
		fmt.Println("位置值越界")
		return
	}
	j:=1
	p,q:=(*list).pNext,(*list).pNext    //头结点
	//查找index-1结点
	for  j<index  {
		p=p.pNext
		j++
	}
	cur:=p.pNext
	p.pNext=cur.pNext
	if p.pNext==q {
		*list=p
	}
        cur=nil
}

func locateList(list *Node){
	fmt.Println("请输入要查找的值:")
	var val int
	fmt.Scanf("%d",&val)
        q:=list.pNext.pNext //第一个结点
	var loc int=0
	for q!=list.pNext {
		loc ++
		if q.data==val {
			break
		}
		q=q.pNext
	}
	if loc==0 {
		fmt.Println("链表中未找到你要的值")
	} else {
		fmt.Printf("你查找的值的位置为:%d\n",loc)
	}
}

func traverse(list *Node) {
	if isempty(list) {
		fmt.Println("空链表")
		return
	}
	fmt.Println("链表内容如下:")
	p:=list.pNext.pNext //第一个结点
	for  p!=list.pNext  {
		fmt.Printf("%5d",p.data)
		p=p.pNext
	}
	fmt.Println()
}

func isempty(list *Node)bool {
	if list.pNext==list {
		return true
	}else {
		return false
	}
}

func listLength(list *Node) int {
	if isempty(list) {
		return 0
	}
	var len int=0
	p:=list.pNext.pNext  //第一个结点
	for p!=list.pNext {
		len++
		p=p.pNext
	}
	return len
}

func main() {
	list:=initList()
	var flag int
	fmt.Println("1.初始化链表")
	fmt.Println("2.插入结点")
	fmt.Println("3.删除结点")
	fmt.Println("4.返回结点位置")
	fmt.Println("5.遍历链表")
	fmt.Println("0.退出")
	fmt.Println("请选择你的操作:")
	fmt.Scanf("%d",&flag)
	for flag!=0 {
             switch flag {
	     case 1:
		     createList(&list)
	     case 2:
		     insertList(&list)
	     case 3:
		     deleList(&list)
	     case 4:
		     locateList(list)
	     case 5:
		     traverse(list)
	     case 0:
		     os.Exit(0)
	     default:
		     fmt.Println("无效操作")
	     }
		fmt.Println("请选择你的操作:")
		fmt.Scanf("%d",&flag)
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

用golang写的一个链表

近期专门研究了一下golang语言,这个语言还比较新,语法上结合了很多优点,比如动态绑定,多返回值,支持函数对象,如果有C/C++,java,js或python语言基础的朋友应该能很快能迁移到这个新语...
  • flashflight
  • flashflight
  • 2017年02月14日 14:26
  • 1292

golang中container/ring包用法

ring包实现了环形链表的操作。   type Ring  //Ring类型代表环形链表的一个元素,同时也代表链表本身。环形链表没有头尾;指向环形链表任一元素的指针都可以作为整个环形链表看待。Ri...
  • chenbaoke
  • chenbaoke
  • 2015年11月11日 12:08
  • 2281

双向循环链表排列字母表go实现

package main import ( "fmt" ) type Data string type dualNode struct { prior *dualNode //前驱指针 ...
  • tangguangqiang
  • tangguangqiang
  • 2017年01月15日 09:28
  • 116

如何用Go实现单链表

关注52AI,做AI的行业领先者。QQ人工智能行业交流群:626784247. 01 一、概念介绍 下面这副图是我们单链表运煤车队。 每...
  • wja8a45TJ1Xa
  • wja8a45TJ1Xa
  • 2017年11月13日 00:00
  • 180

循环链表实例GO语言实现

package main import ( "fmt" "os" ) type Node struct{ data int pNext *Node } func initList() *...
  • tangguangqiang
  • tangguangqiang
  • 2017年01月02日 22:56
  • 392

循环链表的实现与操作(C语言实现)

循环链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。 循环链表的操作 1,循环链表的新操作 2, 获取当前游标指向的数据元素 3, 将游标重置...
  • u010590318
  • u010590318
  • 2014年06月05日 14:55
  • 2354

单循环链表(C语言实现)

//CList.h //结构体定义以及函数声明 #ifndef CLIST_H #define CLIST_H#include #include #include #include typed...
  • Chengzi_comm
  • Chengzi_comm
  • 2016年05月12日 20:08
  • 7155

静态链表GO语言实现

package main import ( "fmt" "log" "os" ) //静态链表节点 type Node struct{ data string cursor int } ...
  • tangguangqiang
  • tangguangqiang
  • 2016年12月13日 22:06
  • 138

【leetcode】通过递归反转单链表 - Go语言实现

问题描述见leetcode第206题:https://leetcode.com/problems/reverse-linked-list/#/description思路使用迭代的方式反转链表大家已经很...
  • tracker_w
  • tracker_w
  • 2017年05月07日 11:08
  • 736

Go语言 简单的爬虫示例(1)

例子1:获得百度首页的html源文件:  package main   import(     "fmt"     "io/ioutil"     "net/http" )   fu...
  • abv123456789
  • abv123456789
  • 2014年04月20日 16:12
  • 2683
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:循环链表实例GO语言实现
举报原因:
原因补充:

(最多只允许输入30个字)