This portion of the program specifies the implemetation of the list and its allowed operations. It is the only part of the program that needs to be changed should the list implementation change.

#define MAXSIZE 5

#define NULL 0

#define SENTINEL -1

typedef struct

{

int month;

int day;

int year;

}date;

typedef struct

{

char name[MAXSIZE];

int share;

float value;

date datebought;

}infofield;

typedef struct listrecord

{

infofield info;

struct listrecord *link;

}stockrecord,*listpointer;

listpointer next(pointer)

/* Returns a copy of the

link field in the record

pointed to by pointer

*/

listpointer pointer;

{

return(pointer->link);

}

listpointer setnull()

/* Returns a null pointer */

{

return(NULL);

}

setlink(pointer1,pointer2)

/* Sets the link field of the

record pointed to by pointer1

to the contents of pointer2

*/

listpointer pointer1,pointer2;

{

pointer1->link = pointer2;

}

setinfo(pointer1,pointer2)

/* Sets the infofield of the record

pointed to by pointer1 to the

infofield of the record

pointed to by pointer2

*/

listpointer pointer1,pointer2;

{

int i;

for(i=0;i<MAXSIZE;i++)

pointer1->info.name[i] = pointer2->

info.name[i];

pointer1->info.shares = pointer2->

info.shares;

pointer1->info.value = pointer2->info.value;

pointer1->info.datebought.month = pointer2->

info.datebought.month;

pointer1->info.datebought.day = pointer2->

info.datebought.day;

pointer1->info.datebought.year = pointer2->

info.datebought.year;

}

listpointer avail()

/* Returns a pointer to storage

allocated for a record of type

stockrecord

*/

{

listpointer malloc();

return(malloc(sizeof(stockrecord)));

}

anotherrecord(recordpointer)

/* Returns true if there is

another record

*/

listpointer recordpointer;

{

listpointer setnull();

return(recordpointer != setnull());

}

listpointer getnextrecord()

/* Inputs the data for the new

record and returns a pointer

to a record containing the data

in its infofield, or, if there

are no new records,returns

a null pointer

*/

{

listpoiner setnull();

static stockrecord nextrecord;

printf("Enter number of shares\n");

scanf("%d",&(nextrecord.info.shares));

if(nextrecord.info.shares != SENTINEL)

{

printf(" Enter the stock name - less than

%d characters\n",MAXSIZE);

scanf("%s",nextrecord.info.name);

printf(" Enter the price of one share of

the stock\n");

scanf("%f",&(nextrecord.info.value));

printf(" Enter the month day year of the

stock purchase\n");

scanf("%d %d %d",&(nextrecord.info.

datebought.month),

&(nextrecord.info.datebought.day),

&(nextrecord.info.datebought.year));

return(&nextrecord);

}

else

return(setnull());

}

printrecord(recordpointer)

/* Prints the contents of the infofield

of the record pointed to by recordpointer

*/

listpointer recordpointer;

{

printf(" The stock is %s\n",

recordpointer->info.name);

printf(" The number of shares is %d\n",

recordpointer->info.shares);

printf(" The value of a share is %f\n",

recordpointer->info.value);

printf(" The date of purchase is %d %d %d\n\n",

recordpointer->info.datebought.month,

recordpointer->info.datebought.day,

recordpointer->info.datebought.year);

}