Source code for ./labs/lab09-64bit/linkedlist.c (via source-highlight)
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define PUSH_FRONT 0
#define PUSH_BACK 1
#define POP_FRONT 2
#define POP_BACK 3
#define PRINT_LIST 4
#define HELP 5
#define QUIT 6
#define INVALID 7
#define BUFFER_SIZE 20
void printOptions();
int readInput(int* val);
int isNumber(const char* token);
int isEmpty(const char* input);
int main(){
// TODO: INSTANTIATE YOUR LINKED LIST HERE.
//----END----
int option, val;
printOptions();
do {
option = readInput(&val);
struct list_item* node;
switch(option){
case PUSH_FRONT: // push onto front of list
// TODO: Insert code to push val onto front of linked list here.
//----END----
break;
case PUSH_BACK: // push onto back of list
// TODO: Insert code to push val onto back of linked list here.
//----END----
break;
case POP_FRONT: // remove from front of list
// TODO: Insert code to remove from front of linked list here.
// If list is empty, do nothing.
//----END----
break;
case POP_BACK: // remove from back of list
// TODO: Insert code to remove from back of linked list here.
// If list is empty, do nothing.
//----END----
break;
case PRINT_LIST: // print list
// TODO: Insert code to print list forwards here.
// Simply print each element separated by a space as shown below:
// Elements: 1 2 3 4 5
printf("Elements: ");
//----END----
break;
case HELP: // print menu
printOptions();
break;
case QUIT: // quit
break;
case INVALID: // bad input
fprintf(stderr,"Invalid command or operand, please input a valid command or help to see the list again.\n");
break;
}
} while(option != QUIT);
// TODO: free any memory used by your linked list here
//----END----
return 0;
}
//---------------------------------------
//NOTE: EVERYTHING BELOW THIS LINE SHOULD NOT BE TOUCHED. IT HANDLES INPUT AND SUCH FOR YOU
//---------------------------------------
int readInput(int* val){
char input[BUFFER_SIZE]="";
while(isEmpty(input)){
printf("Enter command: ");
fgets(input, BUFFER_SIZE, stdin);
input[strcspn(input, "\n")] = 0;
}
char* token = strtok(input, " ");
if ((strcmp(token, "af")) == 0){
token = strtok(NULL, " ");
if (isNumber(token)){
*val = atoi(token);
return PUSH_FRONT;
} else return INVALID;
} else if ((strcmp(token, "ab")) == 0){
token = strtok(NULL, " ");
if (isNumber(token)){
*val = atoi(token);
return PUSH_BACK;
} else return INVALID;
} else if ((strcmp(token, "rf")) == 0){
return POP_FRONT;
} else if ((strcmp(token, "rb")) == 0){
return POP_BACK;
} else if ((strcmp(token, "p")) == 0){
return PRINT_LIST;
} else if((strcmp(token, "help")) == 0){
return HELP;
} else if((strcmp(token, "-1")) == 0){
return QUIT;
} else {
return INVALID;
}
}
void printOptions(){
printf("----------------------------------------------------\n");
printf("This test harness operates with one linked list.\n");
printf("Use any of the following options to manipulate it:\n");
printf("\t* af <num> --- add integer to front\n");
printf("\t* ab <num> --- add integer to back\n");
printf("\t* rf --- remove front element\n");
printf("\t* rb --- remove back element\n");
printf("\t* p --- print list forward\n");
printf("\t* help --- print off this list\n");
printf("\t* -1 --- exit harness\n\n");
}
int isNumber(const char* token){
int length, i = 0;
if (token == NULL) return 0;
if(token[0] == '-') i = 1;
length = strlen(token);
for (; i < length; i++){
if (!isdigit(token[i]))
return 0;
}
return 1;
}
int isEmpty(const char* input){
while (*input != '\0'){
if (!isspace((unsigned char)*input))
return 0;
input++;
}
return 1;
}