// linkedlist.h: header file, ref in
// linkedlist.c, stack.c, queue.c
void addlast(int );
void addfirst(int );
int removefirst();
void printlist();
void printreverse();
int empty();
// linkedlist.c:
#include <stdio.h>
#include <stdlib.h>
#include "linkedlist.h"
struct listnode {
int data;
struct listnode* next;
};
static void printreverse0(struct listnode* );
struct listnode* first = NULL; // front, top
struct listnode* last = NULL; // rear
void addlast(int dataitem) {
// or add to rear, i.e. enqueue
if (last == NULL) { // empty linked list
last = (struct listnode*)
malloc(sizeof(struct listnode));
last -> data = dataitem;
last -> next = NULL;
first = last;
}
else { // case of non-empty linked list
last -> next = (struct listnode*)
malloc(sizeof(struct listnode));
last = last -> next;
last -> data = dataitem;
last -> next = NULL;
}
}
void addfirst(int dataitem) {
// or add to front, i.e. dequeue, or push
struct listnode* newnode = (struct listnode*)
malloc(sizeof(struct listnode));
newnode -> next = first;
newnode -> data = dataitem;
first = newnode;
if (last == NULL) // adding to empty list
last = newnode;
}
int removefirst() {
// or pop
int valuetoreturn = first -> data;
first = first -> next;
if (first == NULL) last = NULL;
return valuetoreturn;
}
int empty() {
return first == NULL;
}
void printlist() {
// first to last, or front to rear
struct listnode* temp = first;
while (temp != NULL) {
printf("%i ", temp -> data);
temp = temp -> next;
}
printf("\n");
}
void printreverse() {
printreverse0(first);
printf("\n");
}
static void printreverse0(struct listnode* temp){
if (temp != NULL) {
printreverse0(temp -> next);
printf("%i ", temp -> data);
}
}
| // stack.h: header file,
// ref in stack.c and linktest.c
void push(int );
int pop();
// stack.c: based on linkedlist.c
#include "linkedlist.h"
#include "stack.h"
void push(int dataItem) {
addfirst(dataItem);
}
int pop() {
return removefirst();
}
// queue.h: header file,
// ref in queue.c and linktest.c
void enqueue(int );
int dequeue();
// queue.c: based on linkedlist.c
#include "linkedlist.h"
#include "queue.h"
void enqueue(int dataitem) {
addlast(dataitem);
}
int dequeue() {
return removefirst();
}
// linkedlist.h: header file,
// ref in
void printlist();
void printreverse();
int empty();
// linktest.c: test program. Note:
// can't use both stack and queue
#include <stdio.h>
#include "queue.h"
#include "stack.h"
#include "linkedlist0.h"
void main() {
int a[] = {2, 3, 5, 7, 11, 13};
int i, t;
for (i = 0; i < 6; i++)
enqueue(a[i]);
printf("Queue:");
printlist();
printreverse();
t = dequeue(); printf("%i ", t);
t = dequeue(); printf("%i\n", t);
// must empty queue to use stack
while (!empty()) t = dequeue();
for (i = 0; i < 6; i++)
push(a[i]);
printf("Stack:");
printlist();
printreverse();
t = pop(); printf("%i ", t);
t = pop(); printf("%i\n", t);
}
|