NicholasAdamou

Singly Linked List in Go

Oct 9th, 2019
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.89 KB | None | 0 0
  1. package main
  2.  
  3. /**
  4.  * Project 2: programming in Go lang
  5.  * Using Go Lang, write a program that:
  6.  *    - fills an array with random integers in the range 10 to 99.
  7.  *    - builds a Singly LinkedList by inserting the integers in the array into the data structure.
  8.  *    - finds the length of a given LinkedList.
  9.  *    - finds the minimum value in a given LinkedList.
  10.  *    - reverses the LinkedList
  11.  *    - remove by value from the LinkedList
  12.  *
  13.  * author: Nicholas Adamou
  14.  * date: 10/7/19
  15.  * Class: CSC-315
  16.  */
  17.  
  18.  
  19. import (
  20.     "fmt"
  21.     "math/rand"
  22. )
  23.  
  24. type Node struct {
  25.     value int
  26.     next *Node
  27. }
  28.  
  29. func insert(LinkedList *Node, value int) *Node {
  30.     if LinkedList == nil {
  31.         return LinkedList
  32.     }
  33.  
  34.     for node := LinkedList; node != nil; node = node.next {
  35.         if node.next == nil {
  36.             node.next = &Node{value, nil}
  37.  
  38.             return LinkedList
  39.         }
  40.     }
  41.  
  42.     return LinkedList
  43. }
  44.  
  45. func findMinimum(LinkedList *Node) (minimum int) {
  46.     for node := LinkedList; node != nil; node = node.next {
  47.         if node.next != nil {
  48.             if node.value < node.next.value {
  49.                 minimum = node.value
  50.             }
  51.         }
  52.     }
  53.  
  54.     return
  55. }
  56.  
  57. func length(LinkedList *Node) (count int) {
  58.     for node := LinkedList; node != nil; node = node.next {
  59.         count += 1
  60.     }
  61.  
  62.     return
  63. }
  64.  
  65. func reverse(LinkedList *Node) *Node {
  66.     if LinkedList == nil {
  67.         return LinkedList
  68.     }
  69.  
  70.     node := LinkedList
  71.  
  72.     if node.next == nil {
  73.         return node
  74.     } else {
  75.         newHead := reverse(node.next)
  76.  
  77.         node.next.next = node
  78.         node.next = nil
  79.  
  80.         return newHead
  81.     }
  82. }
  83.  
  84. func removeByValue(LinkedList *Node, value int) *Node {
  85.     if LinkedList == nil {
  86.         return LinkedList
  87.     }
  88.  
  89.     node := LinkedList
  90.  
  91.     if node.value == value {
  92.         node = node.next
  93.  
  94.         return node
  95.     }
  96.  
  97.     for node.next != nil {
  98.         if node.next.value == value {
  99.             node.next = node.next.next
  100.  
  101.             return LinkedList
  102.         }
  103.  
  104.         node = node.next
  105.     }
  106.  
  107.     return LinkedList
  108. }
  109.  
  110. func print(LinkedList *Node) {
  111.     for node := LinkedList; node != nil; node = node.next {
  112.         if node.next == nil {
  113.             fmt.Printf(" %d", node.value)
  114.         } else {
  115.             fmt.Printf(" %d ->", node.value)
  116.         }
  117.     }
  118.  
  119.     fmt.Println()
  120. }
  121.  
  122. func random(max int, min int) int {
  123.     return rand.Int() % (max - min + 1) + min
  124. }
  125.  
  126. func main() {
  127.     const MIN = 10
  128.     const MAX = 99
  129.     const SIZE = 10
  130.  
  131.     var LinkedList *Node = &Node{random(MAX, MIN), nil}
  132.  
  133.     for i := 1; i < SIZE; i++ {
  134.         insert(LinkedList, random(MAX, MIN))
  135.     }
  136.  
  137.     print(LinkedList)
  138.  
  139.     fmt.Printf("\nLength of LinkedList: %d\n", length(LinkedList))
  140.     fmt.Printf("Minimum value: %d\n", findMinimum(LinkedList))
  141.  
  142.     fmt.Println()
  143.  
  144.     reversed := reverse(LinkedList)
  145.     print(reversed)
  146.  
  147.     fmt.Printf("\nLength of LinkedList: %d\n", length(reversed))
  148.     fmt.Printf("Minimum value: %d\n", findMinimum(reversed))
  149.  
  150.     node := removeByValue(reversed, findMinimum(reversed))
  151.  
  152.     fmt.Printf("\nRemoved %d\n\n", node.value)
  153.  
  154.     print(reversed)
  155.  
  156.     fmt.Printf("\nLength of LinkedList: %d\n", length(reversed))
  157. }
Advertisement