knking.com -- Programming Language Books and Training

 C C++ Java

Books by K. N. King

Home
Books by K. N. King
Short courses
Recommended books
Recommended links
FAQ

C Programming: A Modern Approach (Second Edition)

Chapter 19

Answers to Selected Exercises

2. [was #2; modified]

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

#define PUBLIC  /* empty */
#define PRIVATE static

struct node {
  int data;
  struct node *next;
};

PRIVATE struct node *top = NULL;

PRIVATE void terminate(const char *message)
{
  printf("%s\n", message);
  exit(EXIT_FAILURE);
}

PUBLIC void make_empty(void)
{
  while (!is_empty())
    pop();
}

PUBLIC bool is_empty(void)
{
  return top == NULL;
}

PUBLIC bool is_full(void)
{
  return false;
}

PUBLIC void push(int i)
{
  struct node *new_node = malloc(sizeof(struct node));
  if (new_node == NULL)
    terminate("Error in push: stack is full.");

  new_node->data = i;
  new_node->next = top;
  top = new_node;
}

PUBLIC int pop(void)
{
  struct node *old_top;
  int i;

  if (is_empty())
    terminate("Error in pop: stack is empty.");

  old_top = top;
  i = top->data;
  top = top->next;
  free(old_top);
  return i;
}

4. [was #4; modified]

(a) Contents of stack.c file:

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

static void terminate(const char *message)
{
  printf("%s\n", message);
  exit(EXIT_FAILURE);
}

void make_empty(Stack *s)
{
  s->top = 0;
}

bool is_empty(const Stack *s)
{
  return s->top == 0;
}

bool is_full(const Stack *s)
{
  return s->top == STACK_SIZE;
}

void push(Stack *s, int i)
{
  if (is_full(s))
    terminate("Error in push: stack is full.");
  s->contents[s->top++] = i;
}

int pop(Stack *s)
{
  if (is_empty(s))
    terminate("Error in pop: stack is empty.");
  return s->contents[--s->top];
}

(b) Contents of stack.h file:

#ifndef STACK_H
#define STACK_H

#include <stdbool.h>   /* C99 only */

struct node {
  int data;
  struct node *next;
};

typedef struct node *Stack;

void make_empty(Stack *s);
bool is_empty(const Stack *s);
bool is_full(const Stack *s);
void push(Stack *s, int i);
int pop(Stack *s);

#endif

Contents of stack.c file:

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

static void terminate(const char *message)
{
  printf("%s\n", message);
  exit(EXIT_FAILURE);
}

void make_empty(Stack *s)
{
  while (!is_empty(s))
    pop(s);
}

bool is_empty(const Stack *s)
{
  return *s == NULL;
}

bool is_full(const Stack *s)
{
  return false;
}

void push(Stack *s, int i)
{
  struct node *new_node = malloc(sizeof(struct node));
  if (new_node == NULL)
    terminate("Error in push: stack is full.");

  new_node->data = i;
  new_node->next = *s;
  *s = new_node;
}

int pop(Stack *s)
{
  struct node *old_top;
  int i;

  if (is_empty(s))
    terminate("Error in pop: stack is empty.");

  old_top = *s;
  i = (*s)->data;
  *s = (*s)->next;
  free(old_top);
  return i;
}

Copyright © 2008, 1996 W. W. Norton & Company, Inc. All rights reserved.

Google
 
Web knking.com