please help me using C programing language In this homework, you wil implement a
ID: 3734782 • Letter: P
Question
please help me
using C programing language
In this homework, you wil implement adoubly linked list to maintain a list of books.
Requirements:
Implement a doubly linked list in a le called doublyLinkedList.c
*In a separate file, say bookList.c, rst dene using typedef a structure called Book containing the title, author, price data members. The author's type has to be a structure called Author containing rstname and lastname members. Price is a oating point number.
*Your program will start by reading a binary le that you get from argv[1] which contains a list of book records, and store them in a doubly linked list of book structures. Write a function called load to do this step. The file may or may not be ordered, but you have to maintain the linked list in alphabetical order of Author lastname.
*Your program then will display a menu for the user as follows:
1 Add Book
2 Delete Book
3 Search by Author
4 Search by Title
5 Print Booklist
6 Save and Exit
Based on user input, you will have to read more information from the user. For example, if the user wants to add a book, you need to read title, author firstname, author lastname and price from the user, and add that entry into your linked list in sorted alphabetical order of author lastname.
To do each of the operations in the menu write a separate function. You should have at least the following functions. You may add additional parameters to these functions if you wish.
1.void load(char *lename): Loads the binary file filenameinto the linkedlist.
2.void addBook(Book aBook):Adds a new book aBook into the list. When adding a new book, if the given book title already exists in the list, print an appropriate message and do not insert the new book.
3.void searchByTitle(char *booktitle):Searches the book list for the given booktitle and displays the title, author and price of that book if found. If the book does not exist in the list, print an appropriate message.
4.void searchByAuthor(Author anAuthor):Searches the book list for the given anAuthor and displays the title, author and price of all books by that author. If no such book exists in the list, print an appropriate message.
5.void removeBook(char *booktitle):Removes the book with the specied booktitle from the list, if found. If the book does not exist in the list, print an appropriate message.
6.void printList():Writes the contents of the book list to standard output. This output should be in sorted alphabetical order of author lastname.
7.void saveAndExit():Writes the contents of the booklist to the same data file you used for loading books initially.
Explanation / Answer
C PROGRAMMING LANGUAGE:
#include <stdio.h>
#include <stdlib.h>
// A linked list node
struct Node
{
char title[20], author[20];
float price;
struct Node *next;
struct Node *prev;
};
/* Given a reference (pointer to pointer) to the head of a list
and an int, inserts a new node on the front of the list. */
void push(struct Node** head_ref, int new_data)
{
/ 1. allocate node /
struct Node new_node = (struct Node) malloc(sizeof(struct Node));
/ 2. put in the data /
new_node->title = new_data;
/ 3. Make next of new node as head and previous as NULL /
new_node->next = (*head_ref);
new_node->prev = NULL;
/ 4. change prev of head node to new node /
if((*head_ref) != NULL)
(*head_ref)->prev = new_node ;
/ 5. move the head to point to the new node /
(*head_ref) = new_node;
}
/ Given a node as prev_node, insert a new node after the given node /
void insertAfter(struct Node* prev_node, int new_data)
{
/*1. check if the given prev_node is NULL */
if (prev_node == NULL)
{
printf("the given previous node cannot be NULL");
return;
}
/ 2. allocate new node /
struct Node new_node =(struct Node) malloc(sizeof(struct Node));
/ 3. put in the data /
new_node->data = new_data;
/ 4. Make next of new node as next of prev_node /
new_node->next = prev_node->next;
/ 5. Make the next of prev_node as new_node /
prev_node->next = new_node;
/ 6. Make prev_node as previous of new_node /
new_node->prev = prev_node;
/ 7. Change previous of new_node's next node /
if (new_node->next != NULL)
new_node->next->prev = new_node;
}
/* Given a reference (pointer to pointer) to the head
of a DLL and an int, appends a new node at the end */
void append(struct Node** head_ref, int new_data)
{
/ 1. allocate node /
struct Node new_node = (struct Node) malloc(sizeof(struct Node));
struct Node last = head_ref; /* used in step 5*/
/ 2. put in the data /
new_node->data = new_data;
/* 3. This new node is going to be the last node, so
make next of it as NULL*/
new_node->next = NULL;
/* 4. If the Linked List is empty, then make the new
node as head */
if (*head_ref == NULL)
{
new_node->prev = NULL;
*head_ref = new_node;
return;
}
/ 5. Else traverse till the last node /
while (last->next != NULL)
last = last->next;
/ 6. Change the next of last node /
last->next = new_node;
/ 7. Make last node as previous of new node /
new_node->prev = last;
return;
}
// This function prints contents of linked list starting from the given node
void printList(struct Node *node)
{
struct Node *last;
printf(" Traversal in forward direction ");
while (node != NULL)
{
printf(" %d ", node->data);
last = node;
node = node->next;
}
printf(" Traversal in reverse direction ");
while (last != NULL)
{
printf(" %d ", last->data);
last = last->prev;
}
}
/* Drier program to test above functions*/
int main()
{
/ Start with the empty list /
struct Node* head = NULL;
// Insert 6. So linked list becomes 6->NULL
append(&head, 6);
// Insert 7 at the beginning. So linked list becomes 7->6->NULL
push(&head, 7);
// Insert 1 at the beginning. So linked list becomes 1->7->6->NULL
push(&head, 1);
// Insert 4 at the end. So linked list becomes 1->7->6->4->NULL
append(&head, 4);
// Insert 8, after 7. So linked list becomes 1->7->8->6->4->NULL
insertAfter(head->next, 8);
printf("Created DLL is: ");
printList(head);
getchar();
return 0;
}
/* Given a reference (pointer to pointer) to the head
of a DLL and an int, appends a new node at the end */
void append(struct Node** head_ref, int new_data)
{
/ 1. allocate node /
struct Node new_node = (struct Node) malloc(sizeof(struct Node));
struct Node last = head_ref; /* used in step 5*/
/ 2. put in the data /
new_node->data = new_data;
/* 3. This new node is going to be the last node, so
make next of it as NULL*/
new_node->next = NULL;
/* 4. If the Linked List is empty, then make the new
node as head */
if (*head_ref == NULL)
{
new_node->prev = NULL;
*head_ref = new_node;
return;
}
/ 5. Else traverse till the last node /
while (last->next != NULL)
last = last->next;
/ 6. Change the next of last node /
last->next = new_node;
/ 7. Make last node as previous of new node /
new_node->prev = last;
return;
}