只有本站会员才能查看附件,请 登录
图书书目信息:
书名,作者,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;
{
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);
}
}
}
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;
}