| (mm) | A singly linked list library | ||||||||||||||
| Home | Software | Count | |||||||||||||||
|
Software: GWT GWTOAuthLogin iPhone/iPad iOSExamples BiteByteConverter X/Motif ansi xterm grabc mdgclock miv mplaymidi mppp mxascii mcmap mxcmap mxconsole mxkill mxshowfont qtip xmastm yrolo Web privategpt mhttpd web counter upload.pl TimeTrack.pl mod_auth_ldap Games fltkmm iphonemm Go (cross-platform) go-xbuild-go mailsend-go markdown-toc-go gomail-fork githubdownloadcount genmake-go github-profilegen-go hod-go applehealth2csv Java cdcl cdclgwt jdgclock Libraries libcalen libmcfg libsll libmsock Java cdcl cdclgwt jdgclock Libraries libcalen libmcfg libsll libmsock Misc cubic-fix bangla font dpr genmake hod smtp.pl vhtml phones_ldap showpic_ldap mbasecalc fluid_hack kdialppp strip2csv googlecode-upload mrdialog RNCryptor-C MS Windows mwinclip.pl mbasecalc mailsend wiv mouse_mover |
Sll is a Singly Linked List library. The functions takes pointer to a void data type, so you can make a linked list from any kind of data. It's required that you have to write your own function to free your data. You will pass a pointer to your function while calling sll free routines. Please look at the Examples section for code sample. I hope You will find the library useful. Note, this library is not object oriented, nothing is abstracted, I wrote it this way. I wanted to see clearly what's going on. I wrote it because I was tired of many object oriented linked list libraries out there.
(contains compiled sll.lib for Windows NT/2000) sll Data Structure
typedef struct _Sll
{
void
*data; /* void pointer for user data */
struct _Sll
*next; /* pointer to next node */
} Sll;
sll Function reference
Example 1: Insert a node at the beginning of the list. The code is available in examples/insert directory. /*
** test inserting a node at the beginning of the list. print the result
** and then free the memory. a user defined function is called to free
** the data.
**
** Development History:
** who when why
** ma_muquit@fccc.edu Aug-09-1998 first cut
*/
#include <config.h>
#include <sll.h>
typedef struct _addr
{
char
*name,
*city,
*state;
} Addr;
static void freeData(void **data);
int main (int argc,char **argv)
{
Sll
*l,
*head=NULL,
*new=NULL;
Addr
*addr;
int
n=0;
(void) fprintf(stderr,
"=========================================================================\n");
(void) fprintf(stderr," Testing Insert a node at the beginning of a list\n");
(void) fprintf(stderr,
"=========================================================================\n");
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
/*
** it will be the last node
*/
addr->name=strdup("Muhammad A Muquit");
addr->city=strdup("Philadelphia");
addr->state=strdup("PA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
insertNode(&head,&new);
(void) fprintf(stderr,"Inserting Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** insert node before the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Janet Hunter");
addr->city=strdup("Santa Clara");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
insertNode(&head,&new);
(void) fprintf(stderr,"Inserting Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** insert node before the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Babs Jensen");
addr->city=strdup("Cupertino");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
insertNode(&head,&new);
(void) fprintf(stderr,"Inserting Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** print
*/
(void) fprintf(stderr,"\n\nPrinting........\n");
n=0;
for (l=head; l; l=l->next)
{
addr=(Addr *) l->data;
(void) fprintf(stderr,"Node: %d\n",++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n\n",addr->state);
}
/*
** free nodes
*/
destroyNodes(&head,freeData);
exit(0);
}
/*
** routine to free the user data
*/
static void freeData(void **data)
{
Addr
**addr=(Addr **) data;
static int
n=0;
n++;
if (*addr)
{
if ((*addr)->name)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->name);
(void) free((char *) (*addr)->name);
}
if ((*addr)->city)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->city);
(void) free ((char *) (*addr)->city);
}
if ((*addr)->state)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->state);
(void) free ((char *) (*addr)->state);
}
(void) fprintf(stderr,"Freeing the node %d itself\n\n",n);
(void) free((char *) (*addr));
(*addr)=NULL;
}
}
Example 2: Append a node at the end of the list. The code is available in examples/append directory. /*
** test appending a node at the end of the list. print the result
** and then free the memory. a user defined function is called to free
** the data.
**
** Development History:
** who when why
** ma_muquit@fccc.edu Aug-09-1998 first cut
*/
#include <config.h>
#include <sll.h>
typedef struct _addr
{
char
*name,
*city,
*state;
} Addr;
static void freeData(void **data);
int main (int argc,char **argv)
{
Sll
*l,
*head=NULL,
*new=NULL;
Addr
*addr;
int
n=0;
(void) fprintf(stderr,
"=========================================================================\n");
(void) fprintf(stderr," Testing Append a node at the beginning of a list\n");
(void) fprintf(stderr,
"=========================================================================\n");
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
(void) fprintf(stderr,"\n---------------[ appending ]----------\n");
/*
** it will be the last node
*/
addr->name=strdup("Muhammad A Muquit");
addr->city=strdup("Philadelphia");
addr->state=strdup("PA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNode(&head,&new);
(void) fprintf(stderr,"Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** append node after the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Janet Hunter");
addr->city=strdup("Santa Clara");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNode(&head,&new);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** append node after the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Babs Jensen");
addr->city=strdup("Cupertino");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNode(&head,&new);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** print
*/
(void) fprintf(stderr,"\n---------------[ printing ]----------\n");
n=0;
for (l=head; l; l=l->next)
{
addr=(Addr *) l->data;
(void) fprintf(stderr,"Node: %d\n",++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
}
/*
** free nodes
*/
(void) fprintf(stderr,"\n---------------[ freeing ]----------\n");
destroyNodes(&head,freeData);
exit(0);
}
/*
** routine to free the user data
*/
static void freeData(void **data)
{
Addr
**addr=(Addr **) data;
static int
n=0;
n++;
if (*addr)
{
if ((*addr)->name)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->name);
(void) free((char *) (*addr)->name);
}
if ((*addr)->city)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->city);
(void) free ((char *) (*addr)->city);
}
if ((*addr)->state)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->state);
(void) free ((char *) (*addr)->state);
}
(void) fprintf(stderr,"Freeing the node %d itself\n\n",n);
(void) free((char *) (*addr));
(*addr)=NULL;
}
}
Example 3: Appends a node to the end of a list sorted. /*
** Appends a node to the end of a list sorted. The data of two lists are
** passed to the user defined function compFunction for sorting.
**
** Development History:
** who when why
** ma_muquit@fccc.edu Aug-09-1998 first cut
*/
#include <config.h>
#include <sll.h>
typedef struct _addr
{
char
*name,
*city,
*state;
} Addr;
static void freeData(void **data);
static int compFunc(void *a1,void *a2);
int main (int argc,char **argv)
{
Sll
*l,
*head=NULL,
*new=NULL;
Addr
*addr;
int
n=0;
(void) fprintf(stderr,
"=========================================================================\n");
(void) fprintf(stderr," Testing Append a node at the beginning of a list\n");
(void) fprintf(stderr,
"=========================================================================\n");
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
(void) fprintf(stderr,"\n---------------[ appending ]----------\n");
/*
** it will be the last node
*/
addr->name=strdup("Cindy Muquit");
addr->city=strdup("Philadelphia");
addr->state=strdup("PA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNodeSorted(&head,&new,compFunc);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** append node before the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Janet Hunter");
addr->city=strdup("Santa Clara");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNodeSorted(&head,&new,compFunc);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** append node before the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Babs Jensen");
addr->city=strdup("Cupertino");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNodeSorted(&head,&new,compFunc);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** print
*/
(void) fprintf(stderr,"\n---------------[ printing ]----------\n");
n=0;
for (l=head; l; l=l->next)
{
addr=(Addr *) l->data;
(void) fprintf(stderr,"Node: %d\n",++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
}
/*
** free nodes
*/
(void) fprintf(stderr,"\n---------------[ freeing ]----------\n");
destroyNodes(&head,freeData);
exit(0);
}
/*
** routine to free the user data
*/
static void freeData(void **data)
{
Addr
**addr=(Addr **) data;
static int
n=0;
n++;
if (*addr)
{
if ((*addr)->name)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->name);
(void) free((char *) (*addr)->name);
}
if ((*addr)->city)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->city);
(void) free ((char *) (*addr)->city);
}
if ((*addr)->state)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->state);
(void) free ((char *) (*addr)->state);
}
(void) fprintf(stderr,"Freeing the node %d itself\n\n",n);
(void) free((char *) (*addr));
(*addr)=NULL;
}
}
static int compFunc(void *a1,void *a2)
{
Addr
*addr1=(Addr *) a1,
*addr2=(Addr *) a2;
/*
(void) fprintf(stderr,"name1=%s\n",addr1->name);
(void) fprintf(stderr,"name2=%s\n",addr2->name);
*/
return (strcasecmp(addr1->name,addr2->name));
}
Example 4: Delete a node. /*
** first append a node at the end of a list. then dele a node and free the
** memory associated with data.
**
** Development History:
** who when why
** ma_muquit@fccc.edu Aug-09-1998 first cut
*/
#include <config.h>
#include <sll.h>
typedef struct _addr
{
char
*name,
*city,
*state;
} Addr;
static void freeData(void **data);
int main (int argc,char **argv)
{
Sll
*node,
*l,
*head=NULL,
*new=NULL;
Addr
*addr;
int
n=0;
(void) fprintf(stderr,
"=========================================================================\n");
(void) fprintf(stderr," Append a node at the beginning of a list\n");
(void) fprintf(stderr,
"=========================================================================\n");
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
(void) fprintf(stderr,"\n---------------[ appending ]----------\n");
/*
** it will be the last node
*/
addr->name=strdup("Muhammad A Muquit");
addr->city=strdup("Philadelphia");
addr->state=strdup("PA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNode(&head,&new);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** append node before the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Janet Hunter");
addr->city=strdup("Santa Clara");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNode(&head,&new);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** append node before the last one
*/
addr=(Addr *) malloc(sizeof(Addr));
if (addr == NULL)
{
(void) fprintf(stderr," malloc failed\n");
exit(-1);
}
addr->name=strdup("Babs Jensen");
addr->city=strdup("Cupertino");
addr->state=strdup("CA");
if ((addr->name == NULL) ||
(addr->city == NULL) ||
(addr->state == NULL))
{
(void) fprintf(stderr,"malloc failed\n");
exit(-1);
}
new=allocateNode((void *) addr);
appendNode(&head,&new);
(void) fprintf(stderr,"Appending Node: %d\n", ++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
/*
** print
*/
(void) fprintf(stderr,"\n---------------[ printing ]----------\n");
n=0;
for (l=head; l; l=l->next)
{
addr=(Addr *) l->data;
(void) fprintf(stderr,"Node: %d\n",++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
}
(void) fprintf(stderr,"\n-----------[ delete Node 2 ]---------\n");
node=getNthNode(head,2);
if (node != NULL)
destroyNode(&head,node,freeData);
else
(void) fprintf(stderr,"No node found at position 2\n");
(void) fprintf(stderr,"\n-----------[ printing all the nodes again ]--------\n");
n=0;
for (l=head; l; l=l->next)
{
addr=(Addr *) l->data;
(void) fprintf(stderr,"Node: %d\n",++n);
(void) fprintf(stderr," %s\n",addr->name);
(void) fprintf(stderr," %s\n",addr->city);
(void) fprintf(stderr," %s\n",addr->state);
}
/*
** free nodes
*/
(void) fprintf(stderr,"\n---------------[ freeing ]----------\n");
destroyNodes(&head,freeData);
exit(0);
}
/*
** routine to free the user data
*/
static void freeData(void **data)
{
Addr
**addr=(Addr **) data;
if (*addr)
{
if ((*addr)->name)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->name);
(void) free((char *) (*addr)->name);
}
if ((*addr)->city)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->city);
(void) free ((char *) (*addr)->city);
}
if ((*addr)->state)
{
(void) fprintf(stderr," Freeing: %s\n",(*addr)->state);
(void) free ((char *) (*addr)->state);
}
(void) fprintf(stderr,"Freeing the node itself\n\n");
(void) free((char *) (*addr));
(*addr)=NULL;
}
}
Copyright -
GNU GPL
ChangeLog
URL of this page:
back
|
Page updated:
Thu Oct 9 05:02:23 2025 GMT
Copyright © 2025
muquit@gmail.com.
|
| ||||||||||||