/* Steven Andrews, 4/20/95, modified 9/98 */
/* Performs basic set operations with a linked list */
/* dictionary commands completed 5/12/95 */
/* See documentation called Set doc */
/* Copyright 2003 by Steven Andrews.  Permission is granted
   for non-commercial use of and modifications to the code. */

#ifndef __Set_h
#define __Set_h

struct scell{
	void *key;
	void *item;
	struct scell *next; };

typedef struct sstruct{
	struct scell *list;
	int (*keycmp)(void *,void *);
	int (*itemcmp)(void *,void *); } *set;

set SetAlloc(int (*keycmp)(void *,void *),int (*itemcmp)(void *,void *));
void SetFree(set s,int freek,int freex);
void SetNull(set s,int freek,int freex);
int SetInsert(void *k,void *x,set s);
int SetDelete(void *k,void *x,set s,int freek,int freex);
int SetMember(void *k,void *x,set s);
void *SetItem(void *k,set s);
void **SetItemAt(void *k,set s);
void *SetKey(void *x,set s);
struct scell *SetNext(struct scell *ptr,void **k,void **x,set s);
int Subset(set s1,set s2);
int SetEqual(set s1,set s2);
set SetUnion(set s1,set s2);
set SetIntersect(set s1,set s2);
set SetDiff(set s1,set s2);
int SetCard(set s);

#endif