[数据结构]课程设计:链表的维护与文件形式的保存
来源:互联网 发布:画中画软件哪个好 编辑:程序博客网 时间:2024/05/13 04:03
/* ========= 清翔兔 版权声明 ========= */
/* 欲拷贝此源程序,请注明出处,谢谢. */
/* =====================================*/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(GOODS)
#define FILENAME_LEN 10
#define FORMAT " %3d %10s %10s %6d %10d %10d %s/n" //显示格式
#define FORMAT2 "%s %s %d %d %d %d %s/n" //存贮格式
#define NULL 0
#define TRUE 1
#define FALSE 0
#define ERROR 0
//商品的定义
struct goods //定义
{
char trademark[12]; //品牌
char name[12]; //名称
int number; //数量
int money; //单价
char user[20]; //操作用户
unsigned long int editime; //编辑时间
unsigned long int overtime; //过期时间
struct goods *pNext;
};
typedef struct goods GOODS;
/*初始化*/
GOODS *Creat();
GOODS *Delete(GOODS *phead, int numSelect);
GOODS *Edit(GOODS *phead, int numSelect);
GOODS *Read();
GOODS *ph = NULL;
char Welcome();
void Add(GOODS *phead);
void Show(GOODS *phead);
void Save(GOODS *phead);
void FoundGoods(GOODS *phead, int number);
void OverGoods(GOODS *phead);
void Check();
char user[20];
// Main()函数
void main()
{
char select;
int searchMin,searchMax;
int num_c, number;
int t;
t=getTime(0);
printf(" * ===================================================================== *");
printf("/n * *");
printf("/n * 欢迎使用[家电库存]管理系统 (v1.3) *");
printf("/n * *");
printf("/n * 毛佳茗 06030706 *");
printf("/n * www.i1984.com *");
printf("/n * *");
printf("/n * *");
printf("/n * 当前系统日期:%d年%2d月%2d日 *",t/10000,t%10000/100,t%100);
printf("/n * *");
Check();
SELECT: select = Welcome(); //主界面
switch(select)
{
case '1':
ph = Read();
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:已经读入数据文件! */n");
break;
case '2':
Add(ph);
system("cls");
Show(ph);
break;
case '3':
system("cls");
Show(ph);
if (ph != NULL)
{
printf("/n /1 请输入您要修改的商品编号:");
scanf("%d", &num_c);
ph = Edit(ph, num_c);
}
break;
case '4':
printf("/n /1 请输入您要删除的商品编号:");
scanf("%d", &num_c);
ph = Delete(ph, num_c);
break;
case '5':
system("cls");
Show(ph);
break;
case '6':
Save(ph);
break;
case '7':
printf("/n /2 请输入要查询商品的最低价格:") ;
scanf("%d", &searchMin);
printf("/n /1 请输入要查询商品的最高价格:") ;
scanf("%d", &searchMax);
system("cls");
FoundGoods(ph, searchMax, searchMin);
break;
case '8':
if (ph == NULL)
{
ph = Creat();
system("cls");
Show(ph);
}
else
{
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:数据已经从文件读入,并且存在,需要创建,请重启本软件! */n");
}
break;
case '9':
system("cls");
OverGoods(ph);
break;
case '0':
exit(0);
default :
system("pause");
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:请您重新选择! */n");
break;
}
goto SELECT;
}
// 密码认证
void Check()
{
int check;
char pin1[]="admin"; //此处设定用户口令
char pin[20];
aga:
printf("/n * ===================================================================== *");
printf("/n * *");
printf("/n * [ 登 录 ] *");
printf("/n * *");
printf("/n * ===================================================================== *");
printf("/n /1 请输入帐号:");
scanf ("%s",user);
printf(" /2 请输入密码:");
scanf ("%s",pin);
check=strcmp(pin,pin1);
if (check!=0)
{
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:密码有误,请重新输入! *");
goto aga;
}
else system("cls");
}
// Welcome() 主界面
char Welcome()
{
int num_c;
char select;
_flushall();
printf(" * ===================================================================== *");
printf("/n * [家电库存]管理系统 (v1.3) *");
printf("/n * ===================================================================== *");
printf("/n * 1.载入 2.添加 3.修改 4.删除 5.列表 6.保存 7.查找 8.新建 9.过期 0.退出 *");
printf("/n * ===================================================================== *");
printf("/n /2 请输入您的选择:");
scanf("%c", &select);
return select;
}
// 获取系统时间,此方法在C语言课程设计时编写,可能有较多不完善
int getTime()
{
long int datatime;
time_t t;
struct tm *tm;
char timea[30];
t = time(NULL);
tm = localtime(&t);
strcpy(timea,asctime(tm));
datatime=(timea[20]-48)*10000000+(timea[21]-48)*1000000+(timea[22]-48)*100000+(timea[23]-48)*10000+(timea[8]-48)*10+(timea[9]-48);
if (timea[4]=='J'&&timea[5]=='a') datatime+=1*100;
if (timea[4]=='F') datatime+=2*100;
if (timea[4]=='M'&&timea[6]=='r') datatime+=3*100;
if (timea[4]=='A'&&timea[5]=='p') datatime+=4*100;
if (timea[4]=='M'&&timea[6]=='y') datatime+=5*100;
if (timea[4]=='J'&&timea[6]=='n'&&timea[5]=='u') datatime+=6*100;
if (timea[4]=='J'&&timea[6]=='l'&&timea[5]=='u') datatime+=7*100;
if (timea[4]=='A'&&timea[6]=='g') datatime+=8*100;
if (timea[4]=='S') datatime+=9*100;
if (timea[4]=='O') datatime+=10*100;
if (timea[4]=='N') datatime+=11*100;
if (timea[4]=='D') datatime+=12*100;
return datatime;
}
// 显示
void Show(GOODS *phead)
{
GOODS *pnum_c;
int numtemp=1;
pnum_c = phead;
if(pnum_c == NULL)
{
printf(" * ===================================================================== *");
printf("/n * 当前状态:数据为空或没有数据,请确认后再选择! */n");
}
else
{
printf(" _________________________________________________________________________/n");
printf("/n 编号 品牌 名称 单价 数量 修改日期 操作者/n/n");
do
{
printf(FORMAT, numtemp++, pnum_c->trademark, pnum_c->name, pnum_c->money, pnum_c->number, pnum_c->editime ,pnum_c->user);
pnum_c = pnum_c->pNext;
}while(pnum_c != NULL);
}
}
// 新建
GOODS *Creat(void)
{
GOODS *ph = NULL, *p1 = NULL, *p2 = NULL;
p1 = (GOODS *) malloc(LEN);
if(p1 == NULL)
{
printf("/n /2 创建数据库不成功,请重试!/n");
}
else
{
p2 = p1;
ph = p1;
p2->pNext = NULL;
getchar();
printf("/n /1 请输入商品品牌(5个字内):");
gets(p1->trademark);
printf("/n /2 请输入商品名称(5个字内):");
gets(p1->name);
printf("/n /1 请输入商品单价和数量(用空格分开):");
scanf("%d%d", &p1->money, &p1->number);
printf("/n /2 请输入商品过期日期(如:20050901):");
scanf("%d",&p1->overtime);
strcpy(p1->user,user) ;
p1->editime=getTime(1);
_flushall();
}
return(ph);
}
//删除
GOODS *Delete(GOODS *phead, int numSelect)
{
GOODS *p1 = NULL, *p2 = NULL;
int numtemp,j=0;
p1 = phead;
if (numSelect!=1)
{
if (phead == NULL)
{
printf("/n /2 数据为空没有数据可以删除!/n");
}
else
{
while( p1->pNext != NULL && j<numSelect-2)
{
++j;
p1 = p1->pNext;
}
if (p1->pNext==NULL||j>numSelect-2) return ERROR;
p2 = p1->pNext;
p1->pNext=p2->pNext;
free(p2);
}
}
else
{
p2=p1->pNext;phead=p2;free(p1);
}
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:已经删除相应商品信息! */n");
return phead;
}
GOODS *Edit(GOODS *phead, int numSelect)
{
GOODS *p1 = NULL, *p2 = NULL;
int numtemp,j=0;
p1 = phead;
if (numSelect!=1)
{
if (phead == NULL)
{
printf("/n /2 数据为空没有数据可以删除!/n");
}
else
{
while( p1->pNext != NULL && j<numSelect-2)
{
++j;
p1 = p1->pNext;
}
if (p1->pNext==NULL||j>numSelect-2) return ERROR;
p2 = p1->pNext;
}
}
else
{
p2 = p1;
}
printf("/n /2 请输入%s%s的新单价和新数量(用空格分开):",p2->trademark,p2->name);
scanf("%d%d", &p2->money, &p2->number);
printf("/n /2 请输入新的过期日期(如:20050901):");
scanf("%d",&p2->overtime);
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:已经成功修改相应商品信息! */n");
return phead;
}
// 查找
void FoundGoods(GOODS *phead, int max, int min)
{
GOODS *pnum_c = NULL;
int temp = FALSE;
int numtemp = 1;
pnum_c = phead;
if(pnum_c == NULL)
{
printf(" * ===================================================================== *");
printf("/n * 当前状态:数据为空或没有数据可查找! */n");
}
else
{
printf(" _________________________________________________________________________/n");
printf("/n 编号 品牌 名称 单价 数量 修改日期 操作者/n/n");
while(pnum_c != NULL)
{
if ( (min<(pnum_c->money)) && (max>(pnum_c->money)) )
{
printf(FORMAT, numtemp++, pnum_c->trademark, pnum_c->name, pnum_c->money, pnum_c->number, pnum_c->editime ,pnum_c->user);
temp = TRUE;
}
pnum_c = pnum_c->pNext;
}
if (!temp)
{
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:没有找到相应的商品,请确认! */n");
}
}
}
// 添加
void Add(GOODS *phead)
{
GOODS *p1 = NULL, *p2 = NULL, *pInsert = NULL,*p = NULL;
int temp;
int payInsert;
p = p2 = p1 = phead;
if(p2 == NULL) { printf("/n数据为空没有数据可以打印/n"); }
else
{
pInsert = (GOODS *) malloc(LEN);
_flushall();
printf("/n /2 请输入商品品牌(5个字内):");
gets(pInsert->trademark);
printf("/n /1 请输入商品名称(5个字内):");
gets(pInsert->name);
printf("/n /2 请输入商品单价和数量(用空格分开):");
scanf("%d%d", &pInsert->money, &pInsert->number);
printf("/n /1 请输入商品过期日期(如:20050901):");
scanf("%d",&pInsert->overtime);
strcpy(pInsert->user,user) ;
pInsert->editime=getTime(1);
_flushall();
payInsert=pInsert->money;
if((p->pNext==NULL)&&(payInsert >= p2->money)) //单商品时
{
pInsert->pNext=NULL;
p->pNext=pInsert;
}
else{
if(payInsert <= p2->money)
{ pInsert->pNext = p1;
ph = pInsert;
}
else
{
while ( (payInsert > p2->money) && (p2->pNext!=NULL) ) {p=p2;p2 = p2->pNext;}
if(payInsert < p2->money)
{
p2 = p;
p1 = p->pNext;
p2->pNext = pInsert;
pInsert->pNext = p1;
}
else
{
p=p->pNext;
p->pNext=pInsert;p=p->pNext;
p->pNext=NULL;
}
}
}
}
}
// 保存
void Save(GOODS *phead)
{
FILE *fp = NULL;
char fileName[FILENAME_LEN];
GOODS *p1 = phead;
int listLen = 0;
if (phead == NULL)
{
printf("/n /2 数据为空没有数据可以保存,请确认后重新选择此功能!/n");
}
else
{
while (p1)
{
p1 = p1 ->pNext;
listLen++;
}
printf("/n /2 请输入保存文件名,以txt方式(*.txt):");
_flushall();
gets(fileName);
if ((fp = fopen (fileName, "w")) == NULL)
{
printf("/n /2 打开文件失败!/n");
exit(0);
}
p1 = phead;
while (p1 != NULL)
{
if (! fprintf(fp, FORMAT2, p1->trademark, p1->name, p1->money, p1->number, p1->editime,p1->overtime,p1->user))
{
printf("/n /2 读入文件出错!/n");
}
p1 = p1->pNext;
}
fclose(fp);
}
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:数据文件已经保存! */n");
}
// 查找
void OverGoods(GOODS *phead)
{
GOODS *pnum_c = NULL;
int temp = FALSE;
int numtemp = 1;
int timenow,num;
pnum_c = phead;
timenow=getTime(0);
if(pnum_c == NULL)
{
printf(" * ===================================================================== *");
printf("/n * 当前状态:数据为空或没有数据,请确认! */n");
}
else
{
printf(" _________________________________________________________________________/n");
printf("/n 编号 品牌 名称 单价 数量 过期日期 操作者/n/n");
while(pnum_c != NULL)
{
if ( timenow>(pnum_c->overtime) )
{
printf(FORMAT, numtemp, pnum_c->trademark, pnum_c->name, pnum_c->money, pnum_c->number, pnum_c->overtime ,pnum_c->user);
temp = TRUE;
}
numtemp++;
pnum_c = pnum_c->pNext;
}
if (!temp)
{
system("cls");
printf(" * ===================================================================== *");
printf("/n * 当前状态:没有找到过期的商品! */n");
}
else
{
printf("/n /1 请输入您要删除的商品编号:");
scanf("%d", &num);
ph = Delete(ph, num);
}
}
}
// 读入文件
GOODS *Read(void)
{
FILE *fp = NULL;
char fileName[FILENAME_LEN];
GOODS *p1 = NULL, *p2 = NULL, *ph = NULL;
printf("/n /1 请输入您要打开的数据库文件名,以txt方式(*.txt):");
_flushall();
gets(fileName);
if ((fp = fopen (fileName, "r")) == NULL)
{
printf("/n /2 打开文件失败,请确认后重新启动本软件!/n/n/n");
exit(0);
}
p1 = (GOODS *) malloc(LEN);
p2 = p1;
ph = p1;
ph->pNext = NULL;
while (!feof(fp))
{
if (!fscanf(fp, FORMAT2, &p1->trademark, &p1->name, &p1->money, &p1->number, &p1->editime,&p1->overtime,&p1->user))
printf("/n /2 读入文件出错,可能文件为空,或文件不存在!/n");
p2 = p1;
p1 = (GOODS *) malloc(LEN);
p2->pNext = p1;
}
p2->pNext = NULL;
free(p1);
p1 = NULL;
return ph;
}
/* ========= 清翔兔 版权声明 ========= */
/* 欲拷贝此源程序,请注明出处,谢谢. */
/* =====================================*/
//Data.txt
艾美特 电风扇 120 1000 20050904 20051001 admin
微软 鼠标和键盘 180 90 20050905 20060101 mjm
华美 吸尘器 400 200 20050904 20060101 admin
春兰 空调 1600 80 20050904 20050905 admin
TCL 电视机 1800 200 20050903 20050904 admin
诺基亚 手机 2199 350 20050904 20051101 admin
海尔 冰箱 4000 100 20050904 20060101 admin
联想 笔记本 19999 180 20050903 20060101 admin
松下 等离子电视 21000 20 20050905 20060101 admin
IBM 笔记本 25000 100 20050903 20050904 admin
- [数据结构]课程设计:链表的维护与文件形式的保存
- 数据结构的课程设计
- 数据结构-图的课程设计
- SMW0 HTML模版的形式上传文件 维护MIME类型
- SMW0 HTML模版的形式上传文件 维护MIME类型
- SMW0 HTML模版的形式上传文件 维护MIME类型
- 2013数据结构课程设计之通讯录(复习链表与文件知识)
- 我的数据结构的课程设计
- 数据结构课程设计-通讯录管理系统的设计与实现
- 内部排序算法的实现与比较-数据结构课程设计
- 数据结构课程设计:哈希表的设计
- 数据结构的形式定义
- Android -- 几种保存成jpeg文件的形式
- plist文件的形式保存在本地程序沙盒中
- 指针形式的图像的保存与转换
- jsp中以弹出文件保存对话框的形式保存已有的文件(无超链接)
- [C++]数据结构:链表形式的堆栈LinkedStack类
- 文件的保存与删除
- [数据结构]第五次作业:huffman编码及其译码(二)
- [数据结构]第六次作业:图的建立、遍历、最小生成树、最短路径
- [数据结构]第七次作业:二叉排序树
- [数据结构]第八次作业:快速排序
- JDK5.0的新东西(边学边总结)
- [数据结构]课程设计:链表的维护与文件形式的保存
- [数据结构]第四次作业:二叉数的各种算法
- 专访Java之父:Java是否能够与时俱进?
- 电话费管理系统:清华大学课程设计
- 操作系统编程:进程管理(优先级)
- 客户关系管理系统在医药领域内的应用
- [C++]实验一:使用VC++6.0环境编写C++程序
- [C++]实验二:Pointer and Reference
- [C++]实验三