1、语言课程设计之产品信息管理#include stdio.h /*I/O函数*/#include stdlib.h /*其它说明*/#include string.h /*字符串函数*/#include conio.h /*屏幕操作函数*/#include mem.h /*内存操作函数*/#include ctype.h /*字符操作函数*/#include alloc.h /*动态地址分配函数*/#define N 3 /*定义常数*/typedef struct z1 /*定义数据结构*/ char no5; char name6; char typeno6; char kind8; cha
2、r unit4; char amount6; char price5; char valday10; char data10; struct z1 *next;product;/*以下是函数原型*/ product *init(); /*初始化函数*/product *create(); /*创建链表*/product *delete(product *h); /*删除记录*/void print(product *h); /* 显示所有记录*/void search(product *h); /*查找*/void save(product *h); /*保存*/product *load()
3、; /*读入记录*/product *insert(product *h); /*插入记录*/void append(); /*追加记录*/product *sort(product *h); /*排序*/product *index(product *h); /*索引*/void total(product *h); /*分类合计*/int menu_select(); /*菜单函数*/*主函数开始*/main() int i; product *head; /*链表定义头指针*/ head=init(); /*初始化链表*/ clrscr(); /*清屏*/ for(;) /*无限循环*/
4、 switch(menu_select() /*调用主菜单函数,返回值整数作开关条件*/ /*值不同,执行的函数不同,break 不能省略*/ case 0:head=init();break; /*执行初始化*/ case 1:head=create();break; /*创建链表*/ case 2:save(head);break; /*删除记录*/ case 3:head=delete(head);break; /*显示全部记录*/ case 4:search(head);break; /*查找记录*/ case 5:print(head);break; /*保存文件*/ case 6:
5、head=index(head); break; /*读文件*/ case 7:head=sort(head); break; /*插入记录*/ case 8:head=insert(head);break; /*排序*/ case 9:append();break; /*追加记录*/ case 10:head=load();break; /*索引*/ case 11:exit(0); /*如菜单返回值为12程序结束*/ /*菜单函数,返回值为整数*/menu_select() char *menu=*MENU*, /*定义菜单字符串数*/ 0. init list, /*初始化*/ 1. E
6、nter list, /*输入记录*/ 2. Save the file, /*从表中删除记录*/ 3. Delete a record from list , /*显示单链表中所有记录*/ 4. Search record on name, /*按照姓名查找记录*/ 5. print list, /*将单链表中记录保存到文件中*/ 6. outvalday product, /*从文件中读入记录*/ 7. sort on price , /*插入记录到表中*/ 8. insert record to list, /*排序*/ 9. append record to file, /*追加记录到
7、文件中*/ 10. Load the file, /*索引*/ 11. Quit; /*退出*/ char s3; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ gotoxy(1,25); /*移动光标*/ printf(press any key enter menu.n); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏幕*/ gotoxy(1,1); /*移动光标*/ textcolor(YELLOW); /*设置文本显示颜色为黄色*/ textbackground(BLUE); /*设置背景颜色为蓝色*/ goto
8、xy(10,2); /*移动光标*/ putch(0xc9); /*输出左上角边框*/ for(i=1;i52;i+) putch(0xcd); /*输出上边框水平线*/ putch(0xbb); /*输出右上角边框 */ for(i=3;i17;i+) gotoxy(10,i);putch(0xba); /*输出左垂直线*/ gotoxy(62,i);putch(0xba); /*输出右垂直线*/ gotoxy(10,17);putch(0xc8); /*输出左上角边框*/ for(i=1;i52;i+) putch(0xcd); /*输出下边框水平线*/ putch(0xbc); /*输出
9、右下角边框*/ window(11,3,61,16); /* 制作显示菜单的窗口,大小根据菜单条数设*/ clrscr(); /*清屏*/ for(i=0;i13;i+) /*输出主菜单数组*/ gotoxy(10,i+1); cprintf(%s,menui); textbackground(BLACK); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ gotoxy(10,21); /*移动光标*/ doprintf(n Enter you choice(011):); /*在菜单窗口外显示提信息*/ scanf(%s,s); /*输入选择项*/
10、c=atoi(s);/*将输入的字符串转化为整形数*/ while(c11); /*选择项不在014之间重输*/ return c;/*返回选择项,主程序根据该数调用相应的函数*/product *init() return NULL;/*创建链表*/product *create() int i; product *h=NULL,*info; /* product指向结构体的指针*/ for(;) info=(product *)malloc(sizeof(product); /*申请空间*/ if(!info) /*如果指针info为空*/ printf(nout of memory);
11、/*输出内存溢出*/ return NULL; /*返回空指针*/ inputs(enter no:,info-no,5); /*输入编号并校验*/ if(info-no0=) break; /*如果编号字符为则结束输入*/ inputs(enter name:,info-name,6);/*输入姓名,并进行校验*/ inputs(enter typeno:,info-typeno,6); inputs(enter kind:,info-kind,8); inputs(enter unit:,info-unit,4); inputs(enter amount:,info-amount,6);
12、inputs(enter price:,info-price,5); inputs(enter data:,info-data,10); inputs(enter valday:,info-valday,10); info-next=h; /*将头结点做为新输入结点的后继结点*/ h=info; /*新输入结点为新的头结点*/ return(h); /*返回头指针*/*输入字符串,并进行长度验证*/inputs(char *prompt, char *s, int count) char p255; do printf(prompt); /*显示提示信息*/ scanf(%s,p); /*输入
13、字符串*/if(strlen(p)count)printf(n too long! n); /*进行长度校验,超过count值重输入*/ while(strlen(p)count); strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/*输出链表中结点信息*/void print(product *h) int i=0; /* 统计记录条数*/ product *p; /*移动指针*/ clrscr(); /*清屏*/ p=h; /*初值为头指针*/ printf(nnn*product*n); printf(|rec| nO | name |typeno| kind |unit|
14、amount|price| data | valday |n); printf(|-|-|-|-|-|-|-|-|-|-|n); while(p!=NULL) i+; printf(|%3d|%-4s|%-6s|%-6s|%-8s|%-4s|%6s|%5s|%10s|%10s|n,i,p-no,p-name,p-typeno,p-kind, p-unit,p-amount,p-price,p-data,p-valday); p=p-next; printf(*end*n);/*删除记录*/product *delete(product *h) product *p,*q; /*p为查找到要删除
15、的结点指针,q为其前驱指针*/ char s11; /*存放学号*/ clrscr(); /*清屏*/ printf(please deleted non); /*显示提示信息*/ scanf(%s,s); /*输入要删除记录的学号*/ q=p=h; /*给q和p赋初值头指针*/ while(strcmp(p-no,s)&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/ q=p; /*将p指针值赋给q作为p的前驱指针*/ p=p-next; /*将p指针指向下一条记录*/ if(p=NULL) /*如果p为空,说明链表中没有该结点*/ printf(nlist no %s pr
16、oductn,s); else /*p不为空,显示找到的记录信息*/ printf(*have found*n); printf(| nO | name |typeno| kind |unit|amount|price| data | valday |n); printf(|-|-|-|-|-|-|-|-|-|n); printf(|%-4s|%-6s|%-6s|%-8s|%-4s|%6s|%5s|%10s|%10s|n,p-no,p-name,p-typeno,p-kind, p-unit,p-amount,p-price,p-data,p-valday); printf(*end*n);
17、getch(); /*压任一键后,开始删除*/ if(p=h) /*如果p=h,说明被删结点是头结点*/ h=p-next; /*修改头指针指向下一条记录*/ else q-next=p-next; /*不是头指针,将p的后继结点作为q的后继结点*/ free(p); /*释放p所指结点空间*/ printf(n have deleted No %s productn,s); printf(Dont forget saven);/*提示删除后不要忘记保存文件*/ return(h); /*返回头指针*/*查找记录*/void search(product *h) product *p; /*
18、移动指针*/ char s15; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/ printf(please enter name for searchn); scanf(%s,s); /*输入姓名*/ p=h; /*将头指针赋给p*/ while(strcmp(p-name,s)&p!=NULL) /*当记录的姓名不是要找的,或指针不为空时*/ p=p-next; /*移动指针,指向下一结点*/ if(p=NULL) /*如果指针为空*/ printf(nlist no %s productn,s); /*显示没有该学生*/ else /*显示找到的记录信息*/ printf
19、(*have found*n); printf(| nO | name |typeno| kind |unit|amount|price| data | valday |n); printf(|-|-|-|-|-|-|-|-|-|n); printf(|%-4s|%-6s|%-6s|%-8s|%-4s|%6s|%5s|%10s|%10s|n,p-no,p-name,p-typeno,p-kind, p-unit,p-amount,p-price,p-data,p-valday); printf(*end*n); /*插入记录*/product *insert(product *h) produ
20、ct *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/ char s11; /*保存插入点位置的学号*/ int s1,i; printf(please enter location before the non); scanf(%s,s); /*输入插入点学号*/ printf(nplease new recordn); /*提示输入记录信息*/ info=(product *)malloc(sizeof(product); /*申请空间*/ if(!info) printf(nout of memory); /*如没有申请到,内存溢出*/ return N
21、ULL; /*返回空指针*/ inputs(enter no:,info-no,11); /*输入学号*/ inputs(enter name:,info-name,15); /*输入姓名*/ info-next=NULL; /*设后继指针为空*/ p=h; /*将指针赋值给p*/ q=h; /*将指针赋值给q*/ while(strcmp(p-no,s)&p!=NULL) /*查找插入位置*/ q=p; /*保存指针p,作为下一个p的前驱*/ p=p-next; /*将指针p后移*/ if(p=NULL) /*如果p指针为空,说明没有指定结点*/ if(p=h) /*同时p等于h,说明链表为
22、空*/ h=info; /*新记录则为头结点*/ else q-next=info; /*p为空,但p不等于h,将新结点插在表尾*/ else if(p=h) /*p不为空,则找到了指定结点*/ info-next=p; /*如果p等于h,则新结点插入在第一个结点之前*/ h=info; /*新结点为新的头结点*/ else info-next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/ q-next=info; /*新结点作为q的后继结点*/ printf(n -have inserted %s product-n,info-name); printf(-Dont forg
23、et save-n);/*提示存盘*/ return(h); /*返回头指针*/*保存数据到文件*/void save(product *h) FILE *fp; /*定义指向文件的指针*/ product *p; /* 定义移动指针*/ char outfile10; /*保存输出文件名*/ printf(Enter outfile name,for example c:f1te.txt:n); /*提示文件名格式信息*/ scanf(%s,outfile); if(fp=fopen(outfile,wb)=NULL) /*为输出打开一个二进制文件,如没有则建立*/ printf(can n
24、ot open filen); exit(1); printf(nSaving file.n); /*打开文件,提示正在保存*/ p=h; /*移动指针从头指针开始*/ while(p!=NULL) /*如p不为空*/ fwrite(p,sizeof(product),1,fp);/*写入一条记录*/ p=p-next; /*指针后移*/ fclose(fp); /*关闭文件*/ printf(-save success!-n); /*显示保存成功*/* 从文件读数据*/product *load() product *p,*q,*h=NULL; /*定义记录指针变量*/ FILE *fp; /* 定义指向文件的指针*/ char i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1