Implementing linked list in shell scripting


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Implementing linked list in shell scripting
# 1  
Old 03-29-2017
Implementing linked list in shell scripting

Hello Experts,

Is it possible to implement linked list in shell scripting? is yes then how can we do it? Any working example is highly appreciated.

Thanks in advance.
# 2  
Old 03-29-2017
I'd use arrays. One for the values and one for the next index.


Here is an example of a sorted linked list:

Code:
llinsert() {
   local END=${#LST[@]}
   local i

   for((i=0; NXT[i]; i=NXT[i]))
   do
     if [ "${LST[NXT[i]]}" \> "$1" ]
     then
        ((i=NXT[i]))
        LST[END]=${LST[i]}
        LST[i]="$1"
        ((NXT[END]=NXT[i]))
        ((NXT[i]=END))
        return
     fi
   done

   LST[END]="$1"
   ((NXT[i]=END))
   NXT[END]=0
}

llfirst() {
  pos=NXT[0]
  echo "${LST[pos]}"
}

llnext() {
   (( NXT[pos] )) && {
       ((pos=NXT[pos]))
       echo "${LST[pos]}"
   }
}

LST=("")

llinsert "please"
llinsert "sort"
llinsert "this"
llinsert "small"
llinsert "list"
llinsert "of"
llinsert "words"

llfirst
while llnext
do
  :
done

# Debug - Output array contents
echo
printf "%-4s %-8s %-3s\n" Idx LST NXT
printf "%-4s %-8s %-3s\n" --- -------- ---
for((i=0;i<${#NXT[@]};i++)) {
   printf "%-4s %-8s %-3s\n" "$i" "${LST[i]}" "${NXT[i]}"
}

Output:

Code:
list
of
please
small
sort
this
words

Idx  LST      NXT
---  -------- ---
0             1  
1    list     5  
2    small    4  
3    this     7  
4    sort     3  
5    of       6  
6    please   2  
7    words    0


Last edited by Chubler_XL; 03-29-2017 at 06:27 PM..
These 4 Users Gave Thanks to Chubler_XL For This Post:
# 3  
Old 03-29-2017
bash already supports associative arrays, so IMO the need for linked lists may not be all that critical. Chubler XL gave a really good take on it.
Associative arrays require bash v4
Code:
 declare -A arr=( [start]=foo [foo]=bar [bar]=quux [quux]=grault [grault]=end [end]=end )
 key=start
 while [ $key != "end" ]
 do 
    echo "$key  ${arr[$key]}"
    key=${arr[$key]}
 done


Last edited by jim mcnamara; 03-29-2017 at 10:56 PM..
These 3 Users Gave Thanks to jim mcnamara For This Post:
# 4  
Old 03-30-2017
Quote:
Originally Posted by Chubler_XL
I'd use arrays. One for the values and one for the next index.
Here is an example of a sorted linked list:
Hi Chubler,

Thanks for the reply, can you please also help me to understand the example mentioned here?
# 5  
Old 04-02-2017
Quote:
Originally Posted by jim mcnamara
bash already supports associative arrays, so IMO the need for linked lists may not be all that critical.
Agreed associative arrays are quite a powerful feature, but some problems can still be better served with linked lists. Particularly when maintaining a sequence of items.

Quote:
Originally Posted by mukulverma2408
Hi Chubler,

Thanks for the reply, can you please also help me to understand the example mentioned here?
Firstly I'd like to simplify the solution I provided. I was focusing on maintaining the first array element as the list head and this introduces extra complexity and means the data values were being shuffled during inserts.

This solution maintains the inserted order in the array and simply shuffles the NXT[] indexes for the sorted order.

Code:
llinsert() {
   local END=${#LST[@]}
   local i

   for((i=0; NXT[i]; i=NXT[i]))
   do
     [ "${LST[NXT[i]]}" \> "$1" ] && break
   done

   LST[END]="$1"
   ((NXT[END]=NXT[i]))
   ((NXT[i]=END))

  shift
  (($#)) && llinsert $@
}

llfirst() {
  pos=NXT[0]
  echo "${LST[pos]}"
}

llnext() {
   (( NXT[pos] )) && {
       ((pos=NXT[pos]))
       echo "${LST[pos]}"
   }
}

LST=("")

llinsert please sort this small list
llinsert of words

llfirst
while llnext
do
  :
done

# Debug - Output array contents
echo
printf "%-4s %-8s %-3s\n" Idx LST NXT
printf "%-4s %-8s %-3s\n" --- -------- ---
for((i=0;i<${#NXT[@]};i++)) {
   printf "%-4s %-8s %-3s\n" "$i" "${LST[i]}" "${NXT[i]}"
}

Output:
Code:
list
of
please
small
sort
this
words

Idx  LST      NXT
---  -------- ---
0             5  
1    please   4  
2    sort     3  
3    this     7  
4    small    2  
5    list     6  
6    of       1  
7    words    0

I'll start with an explanation of the data structure:
The LST array contains the key values of the sorted list. Note that LST[0] is a dummy header element and is there to simplify the code.
The NXT array contains the array index of the next element or zero when at the end of the list. NXT[0] is the index of the first element (zero for an empty list).
So in the example above, we look at NXT[0] for the list header and this gives us 5 so LST[5] (list) is our first element.
To find the next element we look at NXT[5] which gives us 6 so we have LST[6] (of)
NXT[6] is 1 giving LST[1] (please)
NXT[1] is 4; we continue in this manner
until we reach NXT[7] which is zero and we come to the end of the list.


The logic of the insert is straight forward:
Code:
   Start at the head of the list (NXT[0])
   Keep steeping thru the list using the NXT[i] value
      until you encounter a key value which is greater than that to be inserted
      or you reach the end of the list
   place the value to be inserted at the end of the list
   set the NXT value to be the last element encountered above (index of item with a greater key or zero)

lldelete is another matter. We have two options here:

1. Simply adjust the NXT pointers to jump over the deleted value and leave it in the LST where it was.
2. Keep a separate free-list and re-use any deleted array values during the next insert.

1. Will waste space in the array, but keeps the llinsert code unchanged.

If using method 2 I'd be tempted to use the NXT pointers to also keep track of the free-list. Then all you would need is a free-list-head variable with the index of the first deleted item, it's NXT[] value would be the next deleted item or zero when it's the last.

If you have any payload data associated with the key, simply store it in another array(s) with the same index as the key.

Hopefully, this gives you an understanding on how shell scripts can be used to implement linked lists.
These 2 Users Gave Thanks to Chubler_XL For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

How to reverse a linked list by traversing only once.?

Program to reverse a linked list by traversing only once. (1 Reply)
Discussion started by: VSSajjan
1 Replies

2. Programming

How to delete the last node in a linked list.?

How to delete the last node in a single linked list given only the pointer to last node ? Head node will not be given. (5 Replies)
Discussion started by: VSSajjan
5 Replies

3. Programming

Help with linked list.

#include<stdio.h> #include<stdlib.h> struct LinkedList { int val; struct LinkedList *next; }node; /*Creating a structure variable*/ typedef struct LinkedList Node; Node *start = NULL; int create(int i) { Node *temp = NULL; if (start == NULL) ... (5 Replies)
Discussion started by: prinsh
5 Replies

4. UNIX for Advanced & Expert Users

Unix linked-list placement

Hi, I am programming in kernel, and I want to use a double linked list that holds infos that every process could access and modify THIS list. So, I suppose it is a 'global' variable since every process(thread) can reach it, I am wondering where to put it? by changing some of the kernel files? (1 Reply)
Discussion started by: louisTan
1 Replies

5. Programming

How to check if something exists in linked list in C?

i have a linked list set up like typedef struct client_list { char *client_name; int client_socket_fd; struct client_list *next; } client; client *client_list=NULL; before adding to the list i check if it already exists, only if it does not then i add if (client_list==NULL... (1 Reply)
Discussion started by: omega666
1 Replies

6. Programming

Help with linked list in C

i have this code typedef struct client_list { char *client_name; struct client_list * next; int client_socket_fd; } client; client *current, *head; head = NULL; char *h="test"; add_client(current, h, head, &client_socket_fd); ... (24 Replies)
Discussion started by: omega666
24 Replies

7. Programming

I need C++ Code for single linked list

I need C++ Code for single linked list With operations as 1)insert at any position 2)delete any 3)change the data of any position (2 Replies)
Discussion started by: girija
2 Replies

8. Shell Programming and Scripting

Shell Scripting Reading List

Hello Everyone, Over the last few months I have begun to expand my programing skills from windows, Java and SQL / PL-SQL programing into the wonderful world of shell scripting. With little training budget my only options for training are books, Internet and this site (BTY... (1 Reply)
Discussion started by: caddis
1 Replies

9. UNIX for Dummies Questions & Answers

List linked files

A perl script that displays the list of files which have multiple links..! ls -l shows number of links in a field. (0 Replies)
Discussion started by: aadi_uni
0 Replies

10. Programming

Reverse single linked list

Can any one help me in reversing the single linked list and at the same time i want to print the reversed links. (2 Replies)
Discussion started by: dhanamurthy
2 Replies
Login or Register to Ask a Question