循环链表实例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)
	}
}

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

相关文章推荐

如何用Go实现单链表

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

golang 实现一种环形队列,及周期任务

环形队列不同语言有很多种不同的实现,不过大部分都比较复杂。 在使用golang实践生产者消费者模型时,发现了一种变相的环形队列,解决2个问题: 1、生产者消费者间数据传递; 2、内存空间预申请,...

linux shell下除了某个文件外的其他文件全部删除的命令

Linux反选删除文件 最简单的方法是 # shopt -s extglob      (打开extglob模式) # rm -fr !(file1)   如果是多个要排除的,可以...

C语言-数据结构-循环链表实例-维吉尼亚(vigener)密码源代码

1. 背景介绍 维吉利亚密码 维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密: ...

循环链表数据结构C语言实现

  • 2012年06月21日 14:34
  • 150KB
  • 下载

c语言实现单向循环链表

  • 2015年09月01日 16:46
  • 2KB
  • 下载

静态链表GO语言实现

package main import ( "fmt" "log" "os" ) //静态链表节点 type Node struct{ data string cursor int } ...

双循环链表的C语言实现

  • 2011年11月05日 11:50
  • 161KB
  • 下载

约瑟夫环单循环链表C语言实现

  • 2009年12月12日 17:48
  • 1KB
  • 下载

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

//CList.h //结构体定义以及函数声明 #ifndef CLIST_H #define CLIST_H#include #include #include #include typed...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:循环链表实例GO语言实现
举报原因:
原因补充:

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