菜鸟,图书馆管理系统,自己写的代码运行有错误,不知道为什么
library.zip
(286.77 KB)
图书书目信息:
书名,作者,ISBN,价格和出版商
1)建立书目信息链表。
2)按书名和作者查询图书。
3) 按出版商分类输出图书信息。
下面是我写的代码,但是运行有问题
1.选择输入记录的时候不能够输入出版商(即结构体中定义的chubanshang),便立刻跳入到了下一次xu
[local]3[/local]
图书书目信息:
书名,作者,ISBN,价格和出版商
1)建立书目信息链表。
2)按书名和作者查询图书。
3) 按出版商分类输出图书信息。
下面是我写的代码,但是运行有问题
1.选择“输入记录”的时候不能够输入出版商(即结构体中定义的chubanshang),便立刻跳入到了下一次循环页面
2.不能进行”查询记录“
2.我写的代码主要是参照老师的学生管理系统写的,自己写的重点在与第3题的接口函数,(即在Student.C当中的最后一个函数GetElem_STUD1,也是参照GetElem_STUD修改的)。我的想法是只要找到与输入的出版商相同的结构体,就输出。如此,进行循环操作。 但是貌似运行的时候有问题吧。。。
最后,处女问。菜鸟级。希望各位大神多多指教。
结构体定义:
程序代码:
struct LNode_STUD { ElemType_STUD data; struct LNode_STUD *next; }; typedef struct LNode_STUD *List_STUD;
MAIN:
程序代码:
#include"c1.h" typedef struct { char book[20]; char author[10];//用字符串数组处理字符串 int ISBN; float price; char chubanshang[20]; }ElemType_STUD; #include "Student.h" #include "Student.c" int ModelSelect() { int iSel; printf("\n ***********************"); printf(" \n1:输入记录\n"); printf(" \n2:查询记录\n"); printf(" \n3:按出版商查询记录\n"); printf(" \n0:退出系统\n"); printf("\n ***********************\n"); printf("\n 请选择操作命令: "); scanf("%d",&iSel); fflush(stdin); return iSel; } void InputRecord(ElemType_STUD *c) { printf("\nPlease input a book information:\n"); puts("book:"); gets(c->book); puts("author:"); gets(c->author); puts("ISBN:"); scanf("%d",&c->ISBN); puts("price:"); scanf("%f",&c->price); puts("chubanshang:"); gets(c->chubanshang);//??为什么不能输入了?? } int QuerySelect() { int iSel; printf("\n ***********************"); printf(" \n1:按书名查询\n"); printf(" \n2:按作者查询\n"); printf(" \n0:返回上一级\n"); scanf("%d",&iSel); fflush(stdin);//清空输入缓存区,以便不影响后面输入的东西 return iSel; } Status CompareID(ElemType_STUD e1,ElemType_STUD e2) { if(!strcmp(e1.book,e2.book)) //???为什么是“!” return TRUE; else return FALSE; } Status CompareName(ElemType_STUD e1,ElemType_STUD e2)//作者名 { if(!strcmp(e1.author,e2.author)) return TRUE; else return FALSE; } Status Comparechubanshang(ElemType_STUD e1,ElemType_STUD e2)//出版商 { if(!strcmp(e1.chubanshang,e2.chubanshang)) return TRUE; else return FALSE; } void visit(ElemType_STUD c) /* ListTraverse()调用的函数(类型要一致) */ { printf("\n*************************************"); printf("\n "); puts(c.book); puts(c.author); printf("%d\n",c.ISBN); printf("%f\n",c.price); puts(c.chubanshang); } main() { List_STUD L; List_STUD p; ElemType_STUD e0,e; int k; int iSel; InitList_STUD(&L); while (1) { iSel=ModelSelect(); switch(iSel) { case 1: InputRecord(&e0); ListInsert_STUD(L,1,e0); break; case 2: iSel=QuerySelect(); switch(iSel) { case 1: printf(" \n请输入书名:\n"); gets(e0.book); k=LocateElem_STUD(L,e0,CompareID); if(!k) { printf(" \n没有该图书的记录:\n"); } else { GetElem_STUD(L,k,&e); visit(e); } break; case 2: printf(" \n请输入作者:\n"); gets(e0.author); k=LocateElem_STUD(L,e0,CompareName); if(!k) { printf(" \n没有该作者记录:\n"); } else { GetElem_STUD(L,k,&e); visit(e); } break; } break; case 3: printf(" \n请输入出版商:\n"); gets(e0.chubanshang); p=L->next; k=LocateElem_STUD(L,e0,Comparechubanshang); if(!k) { printf(" \n没有该出版商记录:\n"); } else { while(p!=NULL) { p=L->next; GetElem_STUD1(L,k,&e); visit(e); } }break; case 0:DestroyList_STUD(&L);exit(0); } } }
函数接口操作
程序代码:
Status InitList_STUD(List_STUD *L) { /* 操作结果:构造一个空的线性表L */ *L=(List_STUD)malloc(sizeof(struct LNode_STUD)); /* 产生头结点,并使L指向此头结点 */ if(!*L) /* 存储分配失败 */ exit(OVERFLOW); (*L)->next=NULL; /* 指针域为空 */ return OK; } Status DestroyList_STUD(List_STUD *L) { /* 初始条件:线性表L已存在。操作结果:销毁线性表L */ List_STUD q; while(*L) { q=(*L)->next; free(*L); *L=q; } return OK; } Status ClearList_STUD(List_STUD L) /* 不改变L */ { /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */ List_STUD p,q; p=L->next; /* p指向第一个结点 */ while(p) /* 没到表尾 */ { q=p->next; free(p); p=q; } L->next=NULL; /* 头结点指针域为空 */ return OK; } Status ListEmpty_STUD(List_STUD L) { /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ if(L->next) /* 非空 */ return FALSE; else return TRUE; } int ListLength_STUD(List_STUD L) { /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */ int i=0; List_STUD p=L->next; /* p指向第一个结点 */ while(p) /* 没到表尾 */ { i++; p=p->next; } return i; } Status GetElem_STUD(List_STUD L,int i,ElemType_STUD *e) /* 算法2.8 */ { /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */ int j=1; /* j为计数器 */ List_STUD p=L->next; /* p指向第一个结点 */ while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */ { p=p->next; j++; } if(!p||j>i) /* 第i个元素不存在 */ return ERROR; *e=p->data; /* 取第i个元素 */ return OK; } int LocateElem_STUD(List_STUD L,ElemType_STUD e,Status(*compare)(ElemType_STUD,ElemType_STUD)) { /* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */ /* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0 */ int i=0; List_STUD p=L->next; while(p) { i++; if(compare(p->data,e)) /* 找到这样的数据元素 */ return i; p=p->next; } return 0; } Status ListInsert_STUD(List_STUD L,int i,ElemType_STUD e) /* 算法2.9。不改变L */ { /* 在带头结点的单链线性表L中第i个位置之前插入元素e */ int j=0; List_STUD p=L,s; while(p&&j<i-1) /* 寻找第i-1个结点 */ { p=p->next; j++; } if(!p||j>i-1) /* i小于1或者大于表长 */ return ERROR; s=(List_STUD)malloc(sizeof(struct LNode_STUD)); /* 生成新结点 */ s->data=e; /* 插入L中 */ s->next=p->next; p->next=s; return OK; } Status ListDelete_STUD(List_STUD L,int i,ElemType_STUD *e) /* 算法2.10。不改变L */ { /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */ int j=0; List_STUD p=L,q; while(p->next&&j<i-1) /* 寻找第i个结点,并令p指向其前趋 */ { p=p->next; j++; } if(!p->next||j>i-1) /* 删除位置不合理 */ return ERROR; q=p->next; /* 删除并释放结点 */ p->next=q->next; *e=q->data; free(q); return OK; } Status ListTraverse_STUD(List_STUD L,void(*vi)(ElemType_STUD)) /* vi的形参类型为ElemType_STUD,与bo2-1.c中相应函数的形参类型ElemType_STUD&不同 */ { /* 初始条件:线性表L已存在 */ /* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */ List_STUD p=L->next; while(p) { vi(p->data); p=p->next; } printf("\n"); return OK; } Status GetElem_STUD1(List_STUD L,int i,ElemType_STUD *e) /* 算法2.8 */ { /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */ int j=1; /* j为计数器 */ List_STUD p=L->next; /* p指向第一个结点 */ while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */ { p=p->next; j++; if(!p||j>i) /* 第i个元素不存在 */ return ERROR; *e=p->data; /* 取第i个元素 */ } return OK; }