#ifndef _LIST1_H_ #define _LIST1_H_ #include <stdbool.h> #define TMAX 50 struct item { char title[TMAX]; float price; }; typedef struct item Item; struct node { Item item; struct node * next; }; typedef struct node Node; typedef Node * List; void InitList (List * plist); bool IsEmpty (List * plist); bool IsFull (List * plist); bool Insert (Item item, List * plist, int num); bool Add (Item item, List * plist); bool Delete (int num, List * plist); bool DeleteAll (List * plist); int Count (List * plist); Node * FindNode (char * ptitle, List * plist); bool ModiNode (char * ptitle, List * plist, void (* pfun) (Node * pnode)); void PrintList (List * plist, void (* pfun) (Item item, int num)); bool Backup (List * plist); #endif
操作函数
#include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <string.h> #include "list1.h" static void ItemToNode (Item item, Node * pnode); void InitList (List * plist) { *plist = NULL; } bool IsEmpty (List * plist) { if (*plist == NULL) return true; else return false; } bool IsFull (List * plist) { Node * pnew; pnew = malloc (sizeof (Node)); if (pnew == NULL) { fprintf (stderr, "memory is full\n"); return true; } free (pnew); return false; } bool Insert (Item item, List * plist, int num) { Node * pn; Node * pt = *plist; int i; i = Count (plist); if (IsFull (plist)) { return false; } pn = malloc (sizeof (Node)); ItemToNode (item, pn); if (i == 0) //when the list is empty *plist = pn; else { if (FindNode (item.title, plist) != NULL) { printf ("there are the same item in the list.\n"); return false; } if (num > i) { printf ("the list only has %d item, it will insert to the last\n", i); while (pt->next != NULL) pt = pt->next; pt->next = pn; } else { if (num <= 1) { pn->next = pt; *plist = pn; } else { while (--num > 1) pt = pt->next; pn->next = pt->next; pt->next = pn; } } } return true; } bool Add (Item item, List * plist) { Node * pn; Node * pt = *plist; char * ptitle = item.title; if (IsFull (plist)) return false; pn = malloc (sizeof (Node)); ItemToNode (item, pn); if (IsEmpty (plist)) *plist = pn; else { if (FindNode (ptitle, plist) != NULL) { printf ("there are the same item in the list.\n"); return false; } while (pt->next != NULL) pt = pt->next; pt->next = pn; } return true; } bool Delete (int num, List * plist) { Node * pn = *plist; Node * pt; int i = Count (plist); if (num > i) { printf ("it has only %d books in the list\n", i); return false; } else if (num <= 0) { printf ("enter the 1 - %d\n", i); return false; } else if (num == 1) { *plist = pn->next; free (pn); pn = NULL; } else { while (--num > 1) pn = pn->next; pt = pn->next; pn->next = pt->next; free (pt); pt = NULL; } return true; } bool DeleteAll (List * plist) { Node * pt; if (*plist == NULL) printf ("List is Empty"); else { while (*plist != NULL) { pt = (*plist)->next; free (*plist); *plist = pt; } } return true; } int Count (List * plist) { int count = 0; Node * pt = *plist; while (pt != NULL) { ++count; pt = pt->next; } return count; } Node * FindNode (char * title, List * plist) { Node * pt = *plist; while (strcmp (title, pt->item.title) != 0) { pt = pt->next; if (pt == NULL) return pt; } printf ("<< %s >> price: ( %.2f ) in the list!!\n", pt->item.title, pt->item.price); return pt; } bool ModiNode (char * ptitle, List * plist, void (* pfun) (Node * pnode)) { Node * pt; pt = FindNode (ptitle, plist); if (pt == NULL) { printf ("can't find which you want to modify.\n"); return false; } (* pfun) (pt); return true; } void PrintList (List * plist, void (* pfun) (Item item, int num)) { Node * pn = *plist; int num = 1; if (*plist == NULL) printf ("list is empty\n"); else { while (pn != NULL) { (* pfun) (pn->item, num++); pn = pn->next; } } } bool Backup (List * plist) { FILE * fp; Node * pn = *plist; int num = 1; if (*plist == NULL) printf ("list is empty\n"); else { if ((fp = fopen ("books.txt", "a+")) == NULL) { fprintf (stdout, "can't open \"books\" file.\n"); return false; } while (pn != NULL) { fprintf (fp, "%d. << %s >> price: ( %.2f$ )\n", num, pn->item.title, pn->item.price); pn = pn->next; num++; } return true; } } static void ItemToNode (Item item, Node * pnode) { pnode->item = item; pnode->next = NULL; }实现函数#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include "list1.h" #define SPACE printf("\n ****************************************************************\n") void A (List * plist, int num); void B (List * plist); void C (List * plist); void D (List * plist); void E (List * plist); void F (List * plist); void G (List * plist); void showmenu (void); void showCount (List * plist); void show (Item item, int num); void changeitem (Node * pnode); int main (void) { List books; Item temp; char chose; SPACE; puts (" this is a book list"); showmenu (); InitList (&books); if (IsFull (&books) == true) { fprintf (stderr, "the memory has no size\n"); exit (1); } scanf ("%c", &chose); while (getchar () != '\n') continue; while ( chose != 'q') { switch (chose - 48) { case 1: puts ("wellcome to add books: "); A (&books, 1); break; case 2: puts ("wellcome to add books where you want: "); B (&books); break; case 3: puts ("you can delete the book in the list"); C (&books); break; case 4: puts ("are you sure to delete all the books? (y or n)"); D (&books); break; case 5: E (&books); break; case 6: F (&books); break; case 7: SPACE; PrintList (&books, show); showCount (&books); SPACE; break; case 8: A (&books, 2); break; case 9: showmenu(); break; case 0: G (&books); break; default :puts ("please enter 0-10 or 'q' to quit: "); break; } puts ("if you want to quit please enter 'q':"); scanf ("%c", &chose); while (getchar () != '\n') continue; } return 0; } /**************************************************************/ void A (List * plist, int select) { Item temp; if (IsFull (plist)) printf ("the list is full\n"); else { puts ("enter the book name (less than 50 characters): "); gets (temp.title); if (select == 1) { if (temp.title[0] != '\0') { puts ("enter the book's price: "); scanf ("%f", &temp.price); while (getchar () != '\n') continue; } if (Add (temp, plist)) printf ("add success\n"); else puts ("you failse"); } else { while (temp.title[0] != '\n' && temp.title[0] != '\0') { puts ("enter the book's price: "); scanf ("%f", &temp.price); while (getchar () != '\n') continue; if (Add (temp, plist)) printf ("add success\n"); else puts ("you failse"); puts ("enter the next book's name,empty line to quit: "); gets (temp.title); } } } showmenu (); } /**************************************************************/ void B (List * plist) { int num; Item temp; if (IsFull (plist)) printf ("the list is full\n"); else { puts ("enter the book name (less than 50 characters): "); gets (temp.title); if (temp.title[0] != '\0') { puts ("enter the book's price: "); scanf ("%f", &temp.price); while (getchar () != '\n') continue; } puts ("enter the num where you want to insert"); scanf ("%d", &num); while (getchar () != '\n') continue; if(Insert (temp, plist, num) == true) puts ("insert success"); } } /**************************************************************/ void C (List * plist) { int num; Node * delp; Node * pt = *plist; if (IsEmpty (plist) == true) printf ("the list is empty you should add some books in it.\n"); else { PrintList (plist, show); puts ("enter the book's num or the book's name you want to delete "); scanf ("%d", &num); while (getchar () != '\n') continue; if (Delete (num, plist) == true) printf ("delete success\n"); else puts ("delete failed"); } } /**************************************************************/ void D (List * plist) { char ans; ans = getchar (); if (ans == 'y') { if (DeleteAll (plist) == true) printf ("delete all success\n"); else puts ("you failed"); } else puts ("ok we will return"); } /**************************************************************/ void E (List * plist) { char title[TMAX]; char ans; if (IsEmpty (plist)) printf ("the list is empty, you should enter some books\n"); else { PrintList (plist, show); puts ("enter the book name which you want to alter: "); scanf ("%s", title); if (ModiNode (title, plist, changeitem) == true) { puts ("you has change it!~ do you want to show the list (y or n)"); while ((ans = getchar ()) == '\n') continue; if (ans == 'y') PrintList (plist, show); } else puts ("you failed"); } } /**************************************************************/ void F (List * plist) { char title[TMAX]; if (IsEmpty (plist)) printf ("the list is empty, you should enter some books\n"); else { puts ("enter the book name:"); gets (title); if (FindNode (title, plist) == false) printf ("%s is not in the list\n", title); } } /**************************************************************/ void G (List * plist) { if (Backup (plist) == true) puts ("enter success"); else puts ("enter failed"); } /**************************************************************/ void showmenu (void) { SPACE; puts (" 1) add a book 2) add a book where you want"); puts (" 3) delete the book 4) delete all books"); puts (" 5) modify the book 6) find the book"); puts (" 7) show the book list 8) add some books"); puts (" 9) showmenu 10) backup the list"); puts (" q) quit"); SPACE; } /**************************************************************/ void show (Item item, int num) { printf (" %d. << %s >> ( %.2f$ )\n", num, item.title, item.price); } /**************************************************************/ void showCount (List * plist) { int num = Count (plist); printf (" ~~~ there are %d books in the list ~~~\n", num); } /**************************************************************/ void changeitem (Node * pnode) { puts ("enter the new book name: "); scanf ("%s", pnode->item.title); puts ("enter the new price"); scanf ("%f", &pnode->item.price); }