Code:
#include <stdio.h>
#include <stdlib.h>
enum Errorcode {CREATELISTFAIL = 1, CREATENODEFAIL, NODENOTFOUND};
typedef struct Node
{
int part_num;
struct Node *next, *previous;
}Node;
typedef struct Linkedlist
{
struct Node *head, *tail;
}Linkedlist;
//functions for i/o
int getinput(char str[]);
void printerror(int code);
//lined list functions
int initalizelist(Linkedlist *list, int part_num);
Node *createnode(void);
int appendlist(Linkedlist **list, int part_num);
int prependlist(Linkedlist **list, int part_num);
void printlist(const Linkedlist *list);
void reverseprintlist(const Linkedlist *list);
void printlistfrom(const Linkedlist *list, int part_num);
void deletelist(Linkedlist *list);
Node *findnode(const Linkedlist *list, int part_num);
int countnodes(const Linkedlist *list);
void removenode(Linkedlist **list, int part_num);
//extra functions
void addtofront(Linkedlist *list);
void addtoend(Linkedlist *list);
void printfrom(const Linkedlist *list);
void removenodefromlist(Linkedlist *list);
int main()
{
int part_num, error_num;
char strenter[] = "Please enter the part number: ";
Linkedlist list;
part_num = getinput(strenter);
error_num = initalizelist(&list, part_num);
if (error_num)
{
printerror(error_num);
}
addtoend(&list);
addtoend(&list);
addtofront(&list);
addtofront(&list);
printlist(&list);
reverseprintlist(&list);
printfrom(&list);
removenodefromlist(&list);
addtoend(&list);
addtofront(&list);
printlist(&list);
deletelist(&list);
return 0;
}
int getinput(char str[])
{
int data;
printf("%s", str);
scanf(" %d", &data);
return data;
}
void printerror(int code)
{
switch (code)
{
case CREATELISTFAIL:
fprintf(stderr, "error creating list\n");
exit(EXIT_FAILURE);
case CREATENODEFAIL:
fprintf(stderr, "error creating node\n");
return;
case NODENOTFOUND:
fprintf(stderr, "data not found\n");
return;
}
}
int initalizelist(Linkedlist *list, int part_num)
{
list->head = NULL;
list->tail= NULL;
list->head = createnode();
if (!list->head)
{
return CREATELISTFAIL;
}
list->head->part_num = part_num;
list->head->next = NULL;
list->head->previous = NULL;
list->tail = list->head;
return 0;
}
Node *createnode(void)
{
return malloc(sizeof(Node));
}
int appendlist(Linkedlist **list, int part_num)
{
Node *tmp_node = createnode();
if (!tmp_node)
{
return CREATENODEFAIL;
}
tmp_node->part_num = part_num;
tmp_node->next = NULL;
if (!(*list)->head->next)
{
tmp_node->previous = (*list)->head;
(*list)->head->next = tmp_node;
(*list)->tail = tmp_node;
return 0;
}
tmp_node->previous = (*list)->tail;
(*list)->tail->next = tmp_node;
(*list)->tail = tmp_node;
return 0;
}
int prependlist(Linkedlist **list, int part_num)
{
Node *tmp_node = createnode();
if (!tmp_node)
{
return CREATENODEFAIL;
}
tmp_node->part_num = part_num;
tmp_node->next = (*list)->head;
(*list)->head->previous = tmp_node;
(*list)->head = tmp_node;
return 0;
}
void printlist(const Linkedlist *list)
{
int count = 1;
Node *current_node = list->head;
while (current_node)
{
printf("node %d's part number is %d\n", count, current_node->part_num);
count++;
current_node = current_node->next;
}
}
void reverseprintlist(const Linkedlist *list)
{
int count = countnodes(list);
Node *current_node = list->tail;
printf("\nreverse print list\n");
while (current_node)
{
printf("node %d's part number is %d\n", count, current_node->part_num);
count--;
current_node = current_node->previous;
}
}
void printlistfrom(const Linkedlist *list, int part_num)
{
int count = 1;
Node *current_node = findnode(list, part_num);
printf("printing nodes from %d as node 1\n", current_node->part_num);
while (current_node)
{
printf("node %d's part number is %d\n", count, current_node->part_num);
count++;
current_node = current_node->next;
}
}
void deletelist(Linkedlist *list)
{
int count = 1;
Node *current = list->head, *tmp_node = NULL;
while (current)
{
tmp_node = current->next;
printf("freeing node %d\n", count);
free(current);
current = tmp_node;
count++;
}
}
Node *findnode(const Linkedlist *list, int part_num)
{
Node *current_node = list->head;
while (current_node)
{
if (current_node->part_num == part_num)
{
return current_node;
}
current_node = current_node->next;
}
return NULL;
}
int countnodes(const Linkedlist *list)
{
int count = 0;
Node *current_node = list->head;
while (current_node)
{
count++;
current_node = current_node->next;
}
return count;
}
void removenode(Linkedlist **list, int part_num)
{
Node *tmp_node = findnode(*list, part_num);
if (!tmp_node->previous)
{
(*list)->head = (*list)->head->next;
(*list)->head->previous = NULL;
tmp_node->next = NULL;
free(tmp_node);
return;
}
if (!tmp_node->next)
{
tmp_node->previous->next = NULL;
(*list)->tail = tmp_node->previous;
tmp_node->previous = NULL;
free(tmp_node);
return;
}
tmp_node->previous->next = tmp_node->next;
tmp_node->next->previous = tmp_node->previous;
tmp_node->next = NULL;
tmp_node->previous = NULL;
free(tmp_node);
}
void addtofront(Linkedlist *list)
{
int part_num, error_num;
char strenter[] = "Please enter the part number: ";
part_num = getinput(strenter);
error_num = prependlist(&list, part_num);
if (error_num)
{
printerror(error_num);
}
}
void addtoend(Linkedlist *list)
{
int part_num, error_num;
char strenter[] = "Please enter the part number: ";
part_num = getinput(strenter);
error_num = appendlist(&list, part_num);
if (error_num)
{
printerror(error_num);
}
}
void printfrom(const Linkedlist *list)
{
int part_num;
char strpart[] = "Please enter the part number you wish to print from: ";
Node *tmp_node;
part_num = getinput(strpart);
tmp_node = findnode(list, part_num);
if (!tmp_node)
{
printerror(NODENOTFOUND);
return;
}
printlistfrom(list, part_num);
}
void removenodefromlist(Linkedlist *list)
{
int part_num;
char strremove[] = "Please enter the part number you wish to remove: ";
Node *tmp_node;
part_num = getinput(strremove);
tmp_node = findnode(list, part_num);
if (!tmp_node)
{
printerror(NODENOTFOUND);
return;
}
removenode(&list, part_num);
}
comments/criticisms welcome