📄 operate.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 + -