
#include <stdio.h>
#include <ctype.h>
#include <limits.h>

#define MAX_NODES 4	/* max number of nodes in array */

#define ADD_NODE 'A'
#define CHANGE_NODE 'C'
#define DISPLAY_NODE 'D'
#define EXIT 'E'
#define SEARCH_FNODE 'F'
#define HELP '?'
#define INSERT_NODE 'I'
#define SEARCH_LNODE 'L'
#define COUNT_NODES 'N'
#define REMOVE_NODE 'R'
#define SORT_NODES 'S'
#define DUMP_TABLE 'T'

/* ------------------------------------------------------------------- */

main()
{
	int ary[MAX_NODES];

	int nodes_in_use = 0;
	int index;
	int temp, i, j;
	int inchar = 'x';	/* force initial prompt */

	while (1) {
		if (inchar != ' ')
			printf("\nEnter Action Code (%c for help): ", HELP);
		switch(toupper(inchar = getchar())) {

/* ------------------------------------------------------------------- */

	case EXIT:
		goto end;	/* break won't do so use goto */

/* ------------------------------------------------------------------- */

	default:
		printf("\n   Invalid command. Please try again\n");
		break;

/* ------------------------------------------------------------------- */

	case HELP:
		printf("\n   The action codes are:\n");
		printf("\t%c - produces this help message\n", HELP);
		printf("\t%c - Add a new node to the end\n", ADD_NODE);
		printf("\t%c - Change a user-selected node\n", CHANGE_NODE);
		printf("\t%c - Display a user-selected node\n", DISPLAY_NODE);
		printf("\t%c - Exit this program\n", EXIT);
		printf("\t%c - Search for first occurrence\n", SEARCH_FNODE);
		printf("\t%c - Insert a new node\n", INSERT_NODE);
		printf("\t%c - Search for last occurrence\n", SEARCH_LNODE);
		printf("\t%c - Report the number of nodes\n", COUNT_NODES);
		printf("\t%c - Remove a user-selected node\n", REMOVE_NODE);
		printf("\t%c - Sort the nodes in ascending order\n", SORT_NODES);
		printf("\t%c - Show all entries in the table\n", DUMP_TABLE);
		break;

/* ------------------------------------------------------------------- */

	case '\n':	/* ignore white space on input */
	case ' ' :
	case '\t':
	case '\v':
	case '\f':
		inchar = ' ';	/* indicate white space input */
		break;

/* ------------------------------------------------------------------- */

	case ADD_NODE:
		if (nodes_in_use == MAX_NODES) {
			printf("\n   Table is full\n");
			break;
		}

		printf("\n   Enter new node's value: ");
		scanf("%3d", &ary[nodes_in_use]);
		++nodes_in_use;
		printf("\n   Node added");
		break;

/* ------------------------------------------------------------------- */

	case DUMP_TABLE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		printf("\n   Table nodes are as follows:\n");
		for (index = 0; index < nodes_in_use; ++index)
			printf("\tNode %2d => %3d\n", index, ary[index]);

		break;

/* ------------------------------------------------------------------- */

	case COUNT_NODES:
		printf("\tThere are %2d nodes in the table\n", nodes_in_use);
		break;

/* ------------------------------------------------------------------- */

	case DISPLAY_NODE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		while (1) {
			printf("\n   Enter node number: ");
			scanf("%d", &index);
			if (index >= 0 && index < nodes_in_use)
				break;

			printf("\n   No such node (%d) in table\n", index);
		}

		printf("\tNode %2d => %3d\n", index, ary[index]);
		break;

/* ------------------------------------------------------------------- */

	case CHANGE_NODE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		while (1) {
			printf("\n   Enter node number: ");
			scanf("%d", &index);
			if (index < 0 || index >= nodes_in_use)
				printf("\n   No such node (%d) in table\n", index);
				break;
		}

		printf("\tNode %2d => %3d\n", index, ary[index]);
		printf("\n   Enter new value: ");
		scanf("%3d", &ary[index]);
		printf("\n   Node changed");
		break;

/* ------------------------------------------------------------------- */

	case SEARCH_FNODE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		printf("\n   Enter search value: ");
		scanf("%d", &temp);

		for (index = 0; index < nodes_in_use; ++index) {
			if (ary[index] == temp) {
				printf("\tValue %3d found in node %3d\n", 
					temp, index);
				goto found1;
			}
		}

		printf("\n   No such value (%d) in table\n", temp);
found1:
		break;

/* ------------------------------------------------------------------- */

	case SEARCH_LNODE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		printf("\n   Enter search value: ");
		scanf("%d", &temp);

		for (index = nodes_in_use - 1; index >= 0; --index) {
			if (ary[index] == temp) {
				printf("\tValue %3d found in node %3d\n", 
					temp, index);
				goto found2;
			}
		}

		printf("\n   No such value (%d) in table\n", temp);
found2:
		break;

/* ------------------------------------------------------------------- */

	case SORT_NODES:	/* simple bubble sort */
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		for (i = nodes_in_use - 2; i >= 0; --i) {
			for (j = 0; j <= i; ++j) {
				if (ary[j] > ary[j + 1]) {
					temp = ary[j];
					ary[j] = ary[j + 1];
					ary[j + 1] = temp;
				}
			}
		}
		printf("\n   Nodes sorted");
		break;

/* ------------------------------------------------------------------- */

	case INSERT_NODE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		if (nodes_in_use == MAX_NODES) {
			printf("\n   Table is full\n");
			break;
		}

		while (1) {
			printf("\n   Enter number of node to insert before: ");
			scanf("%d", &index);
			if (index >= 0 && index < nodes_in_use)
				break;

			printf("\n   No such node (%d) in table\n", index);
		}

		++nodes_in_use;
		for (i = nodes_in_use - 1; i > index; --i) {
			ary[i] = ary[i - 1];
		}
		printf("\n   Enter new node's value: ");
		scanf("%3d", &ary[index]);
		printf("\n   Node inserted");
		break;

/* ------------------------------------------------------------------- */

	case REMOVE_NODE:
		if (nodes_in_use == 0) {
			printf("\n   Table contains no nodes\n");
			break;
		}

		while (1) {
			printf("\n   Enter node number: ");
			scanf("%d", &index);
			if (index >= 0 && index < nodes_in_use)
				break;

			printf("\n   No such node (%d) in table\n", index);
		}

		for (i = index; i < nodes_in_use; ++i) {
			ary[i] = ary[i + 1];
		}
		--nodes_in_use;
		printf("\n   Node removed");
		break;

/* ------------------------------------------------------------------- */

		}
	}

end:	return (0);
}

/* ------------------------------------------------------------------- */

