CS3343/3341
 Analysis of Algorithms 
Spring 2012
  Linked List   
Used as
Stack and Queue
(C Version)


Linked List, with Inherited Stack and Queue (C Version)

Linked List, with Stack and Queue (C Version)
Linked List ItselfStack and Queue along with Test Code
// 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); }
Common Output
Queue:
2 3 5 7 11 13 
13 11 7 5 3 2 
2 3
Stack:
13 11 7 5 3 2 
2 3 5 7 11 13
13 11


Revision date: 2011-12-17. (Please use ISO 8601, the International Standard Date and Time Notation.)