blob: f31967ff23ec14186b3dd296d34f3afb55bbe157 [file] [log] [blame]
#include "port.h"
/*
Macros to manage heap data and linked lists.
Assume:
typedef struct Type Type;
struct Type {
Type *succ; };
Type *node,*head;
head = NULL;
has been elaborated where head is the head of the list.
Elaborating:
node = ALLOCNODE(Type);
INSERTNODE(Type,head,node,succ);
allocates and inserts a list node pointed to by node.
Elaborating:
DELETENODE(Type,head,node,succ);
FREENODE(Type,node);
deletes and frees the list node pointed to by node.
Copyright Ken Keller 1981
*/
#ifdef TEST99
#include "kenk.h"
#endif
#define ALLOCNODE(Type)\
(Type *)malloc(sizeof(Type))
#define INSERTNODE(Type,head,node,succ)\
{\
if((head) == NULL) {\
(head) = (node);\
(node)->succ = NULL; }\
else {\
(node)->succ = (head);\
(head) = (node); }\
}
#define DELETENODE(Type,head,node,succ)\
{\
register Type *lastType,*type;\
\
if((head) == NULL)\
;\
lastType = NULL;\
type = (head);\
while(type->succ != NULL)\
if(type == (node))\
break;\
else {\
lastType = type;\
type = type->succ; }\
if(lastType == NULL)\
(head) = (node)->succ;\
else lastType->succ = (node)->succ;\
}
#define FREENODE(Type,node) free(node);
#ifdef TEST99
main()
{
typedef struct Dragon Dragon;
struct Dragon {
Dragon *succ;
int i; };
Dragon *head = NULL;
Dragon *node;
int cmd,i;
LOOP {
printf("1 Insert node.\n");
printf("2 Delete node.\n");
printf("3 Print list.\n");
scanf("%d",&cmd);
switch(cmd) {
case 1:
printf("Integer?");
scanf("%d",&i);
node = ALLOCNODE(Dragon);
INSERTNODE(Dragon,head,node,succ);
node->i = i;
break;
case 2:
if(head == NULL) {
printf("Can't. List is empty.\n");
break; }
printf("Integer?");
scanf("%d",&i);
node = head;
while(node != NULL)
if(node->i == i) {
DELETENODE(Dragon,head,node,succ);
FREENODE(Dragon,node);
break; }
else node = node->succ;
if(node == NULL)
printf("Can't. Not in list.\n");
break;
case 3:
if(head == NULL) {
printf("List is empty.\n");
break; }
node = head;
while(node != NULL) {
printf("%d ",node->i);
node = node->succ; }
printf("\n");
break;
default:
printf("What?\n");
break; }/*switch*/ }/*LOOP*/
}
#endif