⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 operate.c

📁 图书借阅管理程序v1.2
💻 C
字号:
/***定义一些关于图书数据链表的一般操作的函数**************/
#include<alloc.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>


/*根据查找并反回该节点或NULL*/
struct dnode*   FindBookNodeFromNum(int booknum,struct dnode* bookhead);
/*根据书号找到书并把它删除*/
int DeleteBookFromNum(struct dnode* bookhead,int booknum);
/*根据书号找到书并把它删除*/
int DeleteBookFromNum(struct dnode* bookhead,int booknum);
/**本函数将根据顺序在程序中找到这个结点**/
struct dnode* FindNode(int num,struct dnode* bookhead);
/* 初始化数据结构为双向非循环链表 */
struct dnode* InitList(void);
/* 插入一个新结点(i为插入位置,x为插入的元素) */
int InsertBookNode(int i,struct bookinfo x,struct dnode* bookhead);
/*清除整个链表*/
int ClearBookList(struct dnode* bookhead);
/* 求长度 */
int Length(struct dnode* bookhead);
/* 判断表是否为空 */
int IsEmpty(struct dnode* bookhead);
/* 删除第I个结点 */
int DeleteBookNode(struct dnode* bookhead,int i);
/* 删除图书界面 */
void DeleteBookWin(struct dnode* bookhead);
/** 函数用于求出数据的插入位置*/
int InsertPlaceofBook(int num,struct dnode* bookhead);
/** 判断输入的书号是否有重复(返回1为有重复,0为无重复)*/
int IsBookSame(int num,struct dnode* bookhead);
/* 存储线性表 */
void SaveList(struct dnode* bookhead,char* filename);
/* 加载表格 */
struct dnode* LoadList(char *filename);


struct dnode* FindBookNodeFromNum(int booknum,struct dnode* bookhead)
{
 struct dnode* curp=bookhead->next;
 while((curp!=NULL)&&(curp->book.booknum!=booknum))
    curp=curp->next;
 if((curp!=NULL)&&(curp->book.booknum==booknum))
       return curp;
 else  return NULL;
}

/*根据书号找到书并把它删除*/
int DeleteBookFromNum(struct dnode* bookhead,int booknum)
{
 struct dnode* curp=bookhead->next;
 int count=1;
 while((curp!=NULL)&&(curp->book.booknum!=booknum))
    {curp=curp->next;
     count++;
    }
 if(curp!=NULL)
     {DeleteBookNode(bookhead,count);
      return 1;
     }
 else return 0;
}

/********************本函数将根据顺序在程序中找到这个结点**********************/
struct dnode* FindNode(int num,struct dnode* head)
{
 int count=1;
 struct dnode* curp=head;
 while((curp->next!=NULL)&&(count<num))
     {count++;
      curp=curp->next;
     }
 if((count==num)&&(curp!=NULL)) return(curp->next);
 else return(NULL);
}

/* 初始化数据结构为双向非循环链表 */
struct dnode* InitList(void)
{
static struct dnode* head;
static struct bookinfo book={0,3,"N","N","\0",0};
 char   errormessage[80];
 head=(struct dnode*)malloc(sizeof(struct dnode));
   if(head==NULL)
        {sprintf(errormessage,"系统内存严重不足。");
         MessageBox(20,10,errormessage);
         return NULL;
        }
  head->last=NULL;
  head->next=NULL;
  head->book=book;
  return (head);

}


/* 插入一个新结点 */
int InsertBookNode(int i,struct bookinfo x,struct dnode* head)

{
 struct dnode* curp=head;
 int count=1;
static struct dnode* newnode;
 if(i<1) return(0);
 while((curp!=NULL)&&(count<i))
       {curp=curp->next;
        count++;
       }
 if((curp!=NULL)&&(count==i))
        {newnode=(struct dnode*)malloc(sizeof(struct dnode));
         newnode->book=x;
         if(curp->next==NULL)      /* 如果现在指针指向最后一个结点 */
                {curp->next=newnode;
                 newnode->last=curp;
                 newnode->next=NULL;
                }
         else
                {curp->next->last=newnode;
                 newnode->next=curp->next;
                 curp->next=newnode;
                 newnode->last=curp;
                }
          allbooknode++;   /*新书数量加1*/
          return(1);
         }
  else return(0);
}


/*清除整个链表*/
int ClearBookList(struct dnode* head)
{
 struct dnode* curp=head->next;
 while(curp!=NULL)
      {free(curp->last);
       curp=curp->next;
      }
 return 0;
}

/* 求长度 */
int Length(struct dnode* head)
{
 struct dnode* curp=head;
 int count=0;
 while(curp->next!=NULL)
       {curp=curp->next;
        count++;
       }
 return(count);
}

/*
int Length(struct dnode* head)
{
 struct dnode* curp=head->next;
 int count=0;
 while(curp!=NULL)
       {curp=curp->next;
        count++;
       }
 return(count);
}
*/
/* 判断表是否为空 */
int IsEmpty(struct dnode* head)
{
 if(head->next==NULL)
     return(1);
 else
     return(0);
}

/* 删除第I个结点 */
int DeleteBookNode(struct dnode* head,int i)
{
 struct dnode* curp=head->next;
 int count=1;
 if(curp==NULL) return(0);
 while((curp!=NULL)&&(count<i))
      {curp=curp->next;
       count++;
      }
 if((curp!=NULL)&&(count==i))
      {if(curp->next==NULL)   /* 如果是最后一个结点 */
            {curp->last->next=NULL;}
       else
            {curp->last->next=curp->next;
             curp->next->last=curp->last;
            }
       free(curp);
       allbooknode--;
       return(1);
      }
  else
       return(0);
}



void DeleteBookWin(struct dnode* bookhead)
{
 struct text_info ti;
 char errormessage[80];
 char block[4*71*9];
 int key;
 int booknum;

 struct dnode* deletebook;

 light_mouse(OFF);
 gettextinfo(&ti);
 gettext(5,7,76,16,&block);

 window(6,8,76,14);
 textbackground(BLACK);
 clrscr();
 window(5,7,75,13);
 textbackground(CYAN);
 textcolor(WHITE);
 clrscr();
 gotoxy(32,1);
 cprintf("删除图书!\r\n");
 cprintf(" 请输入要删除的书的号码:");
 gotoxy(2,4);
 cprintf("书号 借出?            图书名称");

 window(6,11,74,12);
 textbackground(BLACK);
 textcolor(LIGHTGREEN);
 clrscr();
 window(6,9,74,9);
 clrscr();
 light_mouse(ON);

 booknum=InputBookNum();
 if(booknum==CANCEL) goto back110;

 deletebook=FindBookNodeFromNum(booknum,bookhead);

 if(deletebook==NULL)
      {sprintf(errormessage,"图书%d根本就不存在。",booknum);
       MessageBox(23,7,errormessage);
      }
 else
      {window(6,11,74,12);
       cprintf("%3d  %3s    %s",deletebook->book.booknum,deletebook->book.borrow_out,deletebook->book.bookname);
       
       if(deletebook->book.borrow_out[0]=='Y')
        {sprintf(errormessage,"注意:图书%d借出去还没有还,不能删除!");
         MessageBox(20,4,errormessage);
         goto back110;
        }

       key=MessageBox(20,4,"真的要删除此书吗?(Y/N)");
       if(key=='y'||key=='Y')
           DeleteBookFromNum(bookhead,booknum);
       }
back110: window(ti.winleft,ti.wintop,ti.winright,ti.winbottom);
         myputtext(5,7,76,16,block);
         textattr(ti.attribute);
         gotoxy(ti.curx,ti.cury);
}




/******** 函数用于求出数据的插入位置*/
int InsertPlaceofBook(int num,struct dnode* head)
{
 int count=1;
 struct dnode* curp=head;
 while((curp->next!=NULL)&&(curp->next->book.booknum<num))
     {count++;
      curp=curp->next;
     }
 return(count);
}



/*** 判断输入的书号是否有重复(返回1为有重复,0为无重复)*/
int IsBookSame(int num,struct dnode* head)
{ /*如果返回0表示没有相同的,返回非0表示有相同的*/
 struct dnode* curp=head->next;
 while(curp!=NULL)
     {if(curp->book.booknum==num) return(1);
      curp=curp->next;
     }
 return(0);
}



/* 存储线性表 */
void SaveList(struct dnode* head,char* filename)
{
 struct dnode* curp=head;
 char   errormessage[80];
 /*int  listlen=Length(head),i;*/
 FILE* fp;
 int bookinfolen=(int)sizeof(struct bookinfo);
 fp=fopen(filename,"wb+");
 if(fp==NULL)
      {sprintf(errormessage,"打开文件 %s 错误。",filename);
       MessageBox(20,10,errormessage);
       return;
      }
  do
     {
      fwrite(&curp->book,bookinfolen,1,fp);
      curp=curp->next;
     }while(curp!=NULL);

 fclose(fp);
}

/* 加载表格 */
struct dnode* LoadList(char *filename)
{
 int count=1;
 struct dnode* head;
 struct bookinfo bookinfonode;
 int bookinfolen=(int)sizeof(struct bookinfo);
 FILE* fp;
 head=InitList();
 fp=fopen(filename,"rb");
  if(fp==NULL)
     {MessageBox(20,10,"加载数据文件错误!!");
      return(head);
     }
 fread(&head->book,bookinfolen,1,fp);/* 读入链头内容 */
do
    {
      fread(&bookinfonode,bookinfolen,1,fp);
      InsertBookNode(count++,bookinfonode,head);
     } while((feof(fp))==0);
 fclose(fp);
 DeleteBookNode(head,--count);
 return (head);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -