这是我自己用C语言编写的图书信息管理系统的一部分代码。初学者请懂的人赐教

hdysily 2013-06-28 12:50:18
#define DATA p->data.bookID,p->data.bookname,p->data.author,p->data.booktype,p->data.publisher,p->data.time,p->data.price
#define END " ----------------------------------------------------------\n"
int saveflag=0; /*是否需要存盘的标志变量*/
/*定义与图书有关的数据结构*/
typedef struct book /*标记为book*/
{
char bookID[20]; /*登录号*/
char bookname[20]; /*书名*/
char author[20]; /*作者名*/
char booktype[20]; /*分类号*/
char publisher[20]; /*出版单位*/
char time[20]; /*出版时间*/
char price[20]; /*价格*/
struct book*next;
};
void Sort_Book(struct book *head); //对图书进行排序
void bookID_Sort(struct book *head); //按图书登录号排序

/*定义每条记录或结点的数据结构,标记为:node*/
typedef struct node
{
struct book data; /*数据域*/
struct node *next; /*指针域*/
}Node,*Link; /*Node为node类型的结构变量,*Link为node类型的指针变量*/
void menu() /*主菜单*/
{
system("cls"); /*调用DOS命令,清屏.与clrscr()功能相同*/
printf("\n\n 广东工业大学商学院图书信息管理系统 \n");
printf(" *************************菜单*********************************\n");
printf(" * 1 输入图书信息 6 修改图书信息 *\n");
printf(" * 2 打印图书信息 7 插入图书信息 *\n");
printf(" * 3 排序图书信息 8 删除图书信息 *\n");
printf(" * 4 统计图书信息 9 保存图书信息 *\n");
printf(" * 5 查找图书信息 0 退出系统 *\n");
printf(" **************************************************************\n");
}
/* ------------------printheader函数,格式化表头-------------------------*/
void printheader() /*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
/* -----------------------printdata函数,格式化输出数据-----------------*/
void printdata(Node *pp) /*格式化输出表中数据*/
{
Node* p;
p=pp;
printf(FORMAT,DATA);

}
/* ------------------------------Wrong函数,输出按键错误信息---------------------*/
void Wrong() /*输出按键错误信息*/
{
printf("\n\n\n\n\n***********错误!:输入发生错误!请按任意键继续**********\n");
getch();
}
/*--------------------------- NOfind函数,用于输出未查找此图书的信息-----------------------*/
void Nofind() /*输出未查找此图书的信息*/
{
printf("\n=====>没有找到此图书!\n");
}
/*---------------------------------------- Disp函数---------------------------------*/
void Disp(Link l) /*显示单链表l中存储的图书记录,内容为book结构中定义的内容*/
{
Node *p;
p=l->next;
if(!p) /*p==NULL,NUll在stdlib中定义为*/
{
printf("\n=====>没有图书数据!\n");
getch();
return;
}
printf("\n");
printheader();

while(p)
{
printdata(p);
p=p->next; /*移动直下一个结点*/
printf(HEADER3);
}
getch();
}
Node* Locate(Link l,char findmess[],char booknameorbookID[])
{
Node *r;
if(strcmp( booknameorbookID,"bookID")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.bookID,findmess)==0)
return r;
r=r->next;
}//结束while(r)
}//结束if(strcmp(booknameorbookID,"bookID")==0)

else if(strcmp(booknameorbookID,"bookname")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.bookname,findmess)==0)
return r;
r=r->next;
}//结束while(r)
}//结束else if(strcmp(booknameorbookID,"bookname")==0)
return 0; /*若未找到,返回一个空指针*/
}//结束Node* Locate(Link l,char findmess[],char booknameorbookID[])
/*输入字符串,并进行长度验证(长度<lens)*/
void stringinput(char *t,int lens,char *notice)
{
char n[255];
do{
printf(notice);
scanf("%s",n);
if(strlen(n)>lens) printf("\n 超出要求长度! \n");
}while(strlen(n)>lens);
strcpy(t,n);
}
/*---------------------------------增加图书记录-----------------------------------*/
void Add ( Link l )
{
Node *p,*r,*s;
char ch,flag=0,bookID[16];
r=l;
s=l->next;
system("cls");
Disp(l);
while(r->next!=NULL)
r=r->next;
while(1)
{
while(1)
{
stringinput(bookID,16,"\n输入登录号(输入返回菜单):");
flag=0;
if(strcmp(bookID,"0")==0)
{
return;
}
s=l->next;
while(s)
{
if(strcmp(s->data.bookID,bookID)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
{
getch();
printf("=====>登录号%s不存在,再试一次? (是(y)/否(n)):",bookID);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')continue;
else
return;
}
else
{
break;
}
}
p=(Node *)malloc(sizeof(Node));
if(!p)
{
printf("\n allocate memory failure ");
return ;
}
strcpy(p->data.bookID,bookID); /*将字符串bookID拷贝到p->data.bookID*/
stringinput(p->data.bookname,16,"书名:");
stringinput(p->data.author,16,"作者名:");
stringinput(p->data.booktype,16," 分类号:");
stringinput(p->data.publisher,16," 出版单位:");
stringinput(p->data.time,16," 出版时间:");
stringinput(p->data.price,16," 价格:");
p->next=NULL;
r->next=p;
r=p;
saveflag=1;
}
return ;
}
//图书排序
void Sort_Book(struct book *head)
{
int a;
printf(" ================================================================\n");
printf(" ** 1-按图书登录号排序 2-按图书价格排序 **\n");
printf(" ** 3-按作者名排序 0-取消排序操作 **\n");
printf(" ================================================================\n");
printf("请输入您选择的编号:");
scanf("%d",&a);
getchar();
switch(a){
case 0:
break;
case 1:
bookID_Sort(head);
break;
case 2:
Price_Sort(head);
break;
case 3:
author_Sort(head);
break;
default:
printf("您的输入有误!\n");
break;
}
}
//按图书登录号排序
void bookID_Sort(struct book *head)
{
struct book *a[1000],*p,*p1,*temp;
int i,k,index,n=0;
char b;
p1=head;
for(p=head;p;p=p->next)
n++;
for(i=0;i<n;i++){
a[i]=p1;
p1=p1->next;
}
for(k=0;k<n-1;k++)
{
index=k;
for(i=k+1;i<n;i++)
{
if(a[i]->bookID<a[index]->bookID)
index=i;
}
temp=a[index];
a[index]=a[k];
a[k]=temp;
}
printf("排序成功!\n");
printf("是否显示排序结果?(y/n)\n");
scanf("%s",&b);
getchar();
switch(b){
case 'n':
break;
case 'y':
printf(" ================================================================\n");
printf(" ** 登录号 图书名 作者名 分类号 出版单位 出版时间 价格 **\n");
for(i=0;i<n;i++){
printf("**%d %s %s %s %s %d %.2f\n\n",p->bookID,p->bookname,p->author,p->booktype,p->publisher,p->time,p->price);
}
printf(" ================================================================\n");
break;
default:
printf("您的输入有误!\n");
break;
}
}

/*---------数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘----*/
void Save(Link l)
{
FILE* fp;
Node *p;
int count=0;
fp=fopen("c:\\book","wb");
if(fp==NULL)
{
printf("\n=====>文件打开失败!\n");
getch();
return ;
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
break;
}
}

if(count>0)
{
getch();
printf("\n\n\n\n\n=====>保存文件完成,总的图书数是:%d\n",count);
getch();
saveflag=0;}
else
{
system("cls");
printf("当前链接为空,没有图书记录被保存!\n");
getch();
}
fclose(fp); /*关闭此文件*/
}
/*--------------------------------主函数--------------------------――――---------*/
void main()
{
Link l; /*定义链表*/
FILE *fp; /*文件指针*/
int select; /*保存选择结果变量*/
char ch; /*保存(y,Y,n,N)*/
int count=0; /*保存文件中的记录条数(或结点个数)*/
Node *p,*r; /*定义记录指针变量*/
l=(Node*)malloc(sizeof(Node));

if(!l)
{
printf("\n allocate memory failure ");
return ;
}

l->next=NULL;
r=l;
fp=fopen("C:\\book","ab+");

if(fp==NULL)
{
printf("\n=====>不能打开文件!\n");
exit(0);
}//结束if(fp==NULL)
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node));
if(!p)
{
printf(" memory malloc failure!\n");
exit(0);
}//结束if(!p)

if(fread(p,sizeof(Node),1,fp)==1)
{
p->next=NULL;
r->next=p;
r=p;
count++;
}//结束 if(fread(p,sizeof(Node),1,fp)==1)

}//结束while(!feof(fp))

fclose(fp); /*关闭文件*/
printf("\n=====>打开文件成功,总的图书数目是: %d.\n",count);

menu();

while(1)
{ getch();
system("cls");
menu();
p=r;
printf("\n 请输入你的选择(0~9):");
scanf("%d",&select);
if(select==0)
{
if(saveflag==1)
{

printf("\n=====>是否保存修改到文件? 是(y)/否(n):");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')Save(l);
}//结束if(saveflag==1)

printf("\n=====>商学院12班制作!\n\n=====>谢谢您的使用!\n");
getch();
break;
}//结束if(select==0)
switch(select)
{
case 1:Add(l);break;
case 2:system("cls");Disp(l);break;
case 3:Sort(l);break;
default: Wrong();getch();break;
}
}

}
...全文
492 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdysily 2013-06-28
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
受教了
赵4老师 2013-06-28
  • 打赏
  • 举报
回复
链表排序参考下面:
//假设带表头结点的单向链表头指针为head,试编写一个算法将值为5的结点插入到连接表的第k个结点前,删除第k个节点,并对该链表进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
    int          data;
    struct NODE *next;
} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;
int i,j,k,n,t;
int main() {
    srand(time(NULL));

    //填写头节点数据
    H.data=-1;
    H.next=NULL;
    head=&H;

    //创建10个节点的单链表
    p=head;
    for (i=0;i<10;i++) {
        q=(struct NODE *)malloc(sizeof(struct NODE));
        if (NULL==q) return 1;
        q->data=rand()%100;//填写0..99的随机值
        q->next=NULL;
        p->next=q;
        p=q;
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //将值为5的结点插入到单链表的第k个结点前
    k=3;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        n++;
        if (k==n) {
            q=(struct NODE *)malloc(sizeof(struct NODE));
            if (NULL==q) return 1;
            q->data=5;
            q->next=p->next;
            p->next=q;
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //删除第k个节点
    k=5;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        n++;
        if (k==n) {
            q=p->next;
            if (q) {
                p->next=q->next;
                free(q);
            }
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //从小到大排序
    for (p=head;p!=NULL && p->next!=NULL;p=p->next) {
        for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {
            if (p->next->data > q->next->data) {

                //交换data
//              printf("swap %02d %02d\n",p->next->data,q->next->data);
//              t=p->next->data;p->next->data=q->next->data;q->next->data=t;

                //或者

                //交换next
//              printf("swap %02d %02d\n",p->next->data,q->next->data);
                s1=p->next;
                s2=p->next->next;
                s3=q->next;
                s4=q->next->next;

                if (s2!=s3) {
                     p->next=s3;
                    s3->next=s2;
                     q->next=s1;
                    s1->next=s4;
                } else {
                     p->next=s3;
                    s3->next=s1;
                           q=s3;
                    s1->next=s4;
                }

                //输出整个单链表
//              s=head->next;
//              while (1) {
//                  if (NULL==s) {
//                      printf("\n");
//                      break;
//                  }
//                  printf("%02d->",s->data);
//                  s=s->next;
//              }
//              getchar();
            }
        }
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //释放所有节点
    p=head->next;
    while (1) {
        if (NULL==p) {
            break;
        }
        q=p->next;
        free(p);
        p=q;
    }

    return 0;
}
//29->82->10->22->71->05->13->60->59->39->
//29->82->05->10->22->71->05->13->60->59->39->
//29->82->05->10->71->05->13->60->59->39->
//05->05->10->13->29->39->59->60->71->82->
//
赵4老师 2013-06-28
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
hdysily 2013-06-28
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:
你有什么问题呢。。
编码的时候出错了 排序有问题
hdysily 2013-06-28
  • 打赏
  • 举报
回复
编码的时候出错了,因为是新手,老找不出问题所在,故才发帖请求赐教
hugett 2013-06-28
  • 打赏
  • 举报
回复
你有什么问题呢。。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧