本文实例为大家分享了C语言实现图书借阅系统的具体代码,供大家参考,具体内容如下
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#include "book.h"
#define ElemType Book //使用Book作为线性表元素的类型
#include "sqlist.h"
SqList s; //存书表
SqList b; //借书表
void SystemInitialize();
void SystemTerminate();
void SystemRun();
int main(int argc, char *argv[])
{
SystemInitialize();
SystemRun();
SystemTerminate();
system("PAUSE");
return 0;
}
void SystemInitialize ()
{
InitList ( s );
InitList ( b );
Book mybooks[] = {
{"C Programming Language"},
{"Data Structures"},
{"C++ Programming Language"},
{"Effactive C++"},
{"More Effactive C++"},
{"Design Patterns"}
};
for ( int i=0; i<6; i++ )
ListInsert( s, i, mybooks[i]);
}
void SystemRun()
{
char GetCommand();
void DoCommand (char cmd);
char cmd;
do {
cmd = GetCommand();
DoCommand(cmd);
} while ( cmd!='q' );
}
char GetCommand ()
{
char str[64];
printf("\na:新书 b:借书 r:还书 p:打印 q:退出\n" );
printf(".");
//cin.getline(str,64);
read(str);
return str[0];
}
void DoCommand ( char cmd )
{
void AddNewBook();
void BorrowBook();
void ReturnBook();
void PrintBookLists();
switch ( cmd ) {
case 'a':
AddNewBook();
break;
case 'b':
BorrowBook();
break;
case 'r':
ReturnBook();
break;
case 'p':
PrintBookLists();
break;
case 'q':
break;
default:
printf("命令错误");
}
}
void AddNewBook()
{
Book abook;
printf( "\n输入新书名:");
ReadBook(abook);
if ( ListInsert(s,1,abook) )
printf( "入库成功" );
else
printf( "入库失败" );
}
void BorrowBook()
{
Book abook;
int k;
printf("\n借书书名:");
ReadBook(abook);
k = LocateElem(s,abook,BookEqual);
if ( k!=0 ) {
// TODO (#1#): 借书
ListDelete(s,k,abook);
ListInsert(b,k,abook);
//-------------------------------------
printf("\n借书成功" );
} else
printf( "\n查无此书" );
}
void ReturnBook()
{
Book abook;
int k;
printf( "\n还书书名:");
ReadBook(abook);
k = LocateElem(b,abook,BookEqual);
if ( k!=0 ) {
// TODO (#1#): 还书
ListInsert(s,k,abook);
ListDelete(b,k,abook);
//-------------------------------------
printf("\n还书成功" );
} else
printf( "\n查无此书" );
}
void PrintBookLists()
{
printf( "库存 %d本书\n" , ListLength(s) );
ListTraverse ( s, PrintBook );
printf( "\n借出%d本书 " , ListLength(b) );
ListTraverse ( b, PrintBook );
}
void SystemTerminate ()
{
DestroyList ( s );
DestroyList ( b );
}
#ifndef SQLIST_H_INCLUDED
#define SQLIST_H_INCLUDED
#include "ds.h" //for Status,OK ...
#ifndef ElemType
#define ElemType int
#define ELEMTYPE_TAG
#endif
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前已分配的存储空间(元素个数)
} SqList;
//创建并初始化为空表
Status InitList(SqList &L);
//销毁整个表(从此之后不再可用)
Status DestroyList(SqList &L);
//将表L置空
Status ClearList(SqList &L);
//判断表L是否为空表
bool ListEmpty(SqList L);
//求表L的长度
int ListLength(SqList L);
//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR
Status GetElem(SqList L, int i, ElemType &e);
template <typename T> bool equal(T a, T b)
{
return a==b;
}
//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0
// compare(a,b) 为比较函数,匹配时返回true,否则返回false
// 这里默认使用equal进行比较
int LocateElem(SqList L, ElemType e,
bool (*compare)(ElemType,ElemType));
//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
Status ListInsert(SqList &L, int i, ElemType e);
//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR
Status ListDelete(SqList &L, int i, ElemType &e);
//遍历表L,对每个元素调用visit(x).
Status ListTraverse(SqList L, Status (*visit)(ElemType));
//创建并初始化为空表
Status InitList(SqList &L)
{
// TODO (#1#): 创建空表
L.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
L.length=L.listsize=0;
L.listsize=LIST_INIT_SIZE;
return OK;
//-------------------------------------
}
//销毁整个表(从此之后不再可用)
Status DestroyList(SqList &L)
{
// TODO (#1#): 销毁表
if(L.elem){
free(L.elem);
return OK;
}
else
return ERROR;
//-------------------------------------
}
//将表L置空
Status ClearList(SqList &L)
{
// TODO (#1#): 清空表
if(L.elem==NULL){
L.length=0;
return OK;
}else
return ERROR;
//-------------------------------------
}
//判断表L是否为空表
bool ListEmpty(SqList L)
{
// TODO (#1#): 顺序表判空
if (L.length==0) return false;
else return OK;
//-------------------------------------
}
//求表L的长度
int ListLength(SqList L)
{
// TODO (#1#): 求顺序表长度
return L.length;
//-------------------------------------
}
//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR
Status GetElem(SqList L, int i, ElemType &e)
{
// TODO (#1#): 取元素
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];
return OK;
//-------------------------------------
}
//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0
// compare(a,b) 为比较函数,匹配时返回true,否则返回false
int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType))
{
// TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素
for (int j=0; j<L.length; j++)
if ( compare(L.elem[j],e) ) return j+1;
return 0;
//-------------------------------------
}
//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
Status ListInsert(SqList &L, int i, ElemType e)
{
// TODO (#1#): 在链表中插入元素
if (i<1||i>L.length+1) return ERROR;
for(int j=L.length;j>=i;j--)
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;
L.length++;
return OK;
//-------------------------------------
}
//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR
Status ListDelete(SqList &L, int i, ElemType &e)
{
// TODO (#1#): 在顺序表中删除元素
if(i<1||i>L.length)
return ERROR;
for(int j=i;j<=L.length;j++)
L.elem[j-1]=L.elem[j];
--L.length;
return OK;
//-------------------------------------
}
//遍历表L,对每个元素调用visit(x).
Status ListTraverse(SqList L, Status (*visit)(ElemType))
{
// TODO (#1#): 遍历顺序表
for (int j=0; j<L.length; j++)
if ( ! visit(L.elem[j]) ) return ERROR;
return OK;
//-------------------------------------
}
#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif
#endif // SQLIST_H_INCLUDED
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。