student[j]=student[j+1];
num--;
创建通讯录:
添加一项记录:
删除操作:
•五、结束语
通过本题的锻炼,让我更加熟悉顺序表的使用了。
顺序表虽然查询比较方便,但在插入删除操作都比较繁琐。
或许还能用链式表做改进。
•六、程序的源代码清单
#include
#include
#include
#include
structrecord
{
charname[8];
charsex[20];
charnum[20];
chartel[20];
charaddress[20];
}student[500];
structslnode
{
recorddate;
structslnode*next;
structslnode*prior;
};
typedefslnode*linklist;
linklistl;
intnum=0;
FILE*fp;
voidmainmenu();
voidsearchmenu();
voidenter();
voidsearch();
voiddisplay();
voidload();
voidsave();
voiddelet();
voidlistinsert();
voidinitlist();
voidmain()
{
initlist();
load();
listinsert();
while
(1)
mainmenu();
}
voidload()
{
if((fp=fopen("student.bin","rb"))==NULL)
{
printf("\n\t\t通讯录文件不存在");
if((fp=fopen("student","wb"))==NULL)
{
printf("\n\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t通讯录文件已建立");
printf("\n\t\t按任意键进入主菜单");
getch();
return;
}
exit(0);
}
fseek(fp,0,2);
if(ftell(fp)>0)
{
rewind(fp);
for(num=0;!
feof(fp)&&fread(&student[num],sizeof(structrecord),1,fp);num++);
printf("\n\t\t文件导入成功");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
printf("\n\t\t文件导入成功");
printf("\n\t\t通讯录文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
voidmainmenu()//主菜单
{
charchoic;
system("cls");
printf("\n\t\t***************欢迎进入通讯录系统***************");
printf("\n\t\t******************1-新添纪录******************");
printf("\n\t\t******************2-查找联系人****************");
printf("\n\t\t******************3-删除联系人***************");
printf("\n\t\t******************4-保存退出*****************");
printf("\n\t\t******************5-不保存退出***************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:
");
choic=getch();
switch(choic)
{
case'1':
enter();break;
case'2':
searchmenu();break;
case'3':
delet();break;
case'4':
save();break;
case'5':
exit(0);
default:
mainmenu();
}
}
voidsearchmenu()//查询菜单
{
charchoic;
system("cls");
printf("\n\t\t*******************查询菜单*******************");
printf("\n\t\t****************1-显示所有********************");
printf("\n\t\t****************2-按姓名查询******************");
printf("\n\t\t****************3-返回主菜单******************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:
");
choic=getch();
switch(choic)
{
case'1':
display();break;
case'2':
search();break;
case'3':
mainmenu();break;
}
}
voidenter()//添加纪录
{
printf("\n\t\t****************请输入学生信息****************\n");
printf("\n\t\t姓名:
");
scanf("%s",&student[num].name);
printf("\n\t\t性别:
");
scanf("%s",&student[num].sex);
printf("\n\t\t编号:
");
scanf("%s",&student[num].num);
printf("\n\t\t输入电话:
");
scanf("%s",&student[num].tel);
printf("\n\t\t地址:
");
scanf("%s",&student[num].address);
num++;
printf("\n\t\t是否继续添加?
(Y/N):
");
if(getch()=='y')
enter();
return;
}
voiddisplay()//显示所有
{
inti;
system("cls");
if(num!
=0)
{
printf("\n\t\t***************以下为通讯录所有信息************");
for(i=0;i{
printf("\n\t\t姓名:
%s",student[i].name);
printf("\n\t\t性别:
%s",student[i].sex);
printf("\n\t\t编号:
%s",student[i].num);
printf("\n\t\t电话:
%s",student[i].tel);
printf("\n\t\t地址:
%s",student[i].address);
printf("\t\t");
if(i+1{
printf("\n\t\t__________________________");
system("pause");
}
}
printf("\n\t\t************************************************");
}
else
printf("\n\t\t通讯录中无任何纪录");
printf("\n\t\t按任意键返回主菜单:
");
getch();
return;
}
voidsave()//写入文件
{
inti;
if((fp=fopen("student","wb"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for(i=0;i{
if(fwrite(&student[i],sizeof(structrecord),1,fp)!
=1)
{
printf("\n\t\t写入文件错误!
\n");
}
}
fclose(fp);
printf("\n\t\t通讯录文件已保存");
printf("\n\t\t按任意键退出程序\n\t\t");
exit(0);
}
voidlistinsert()//增加一个结点
{
linklists,p=l;
for(inti=0;i{
s=newslnode;
strcpy(s->date.name,student[i].name);
strcpy(s->date.num,student[i].num);
strcpy(s->date.sex,student[i].sex);
strcpy(s->date.tel,student[i].tel);
strcpy(s->date.address,student[i].address);
s->prior=p->prior;
s->next=p;
p->prior->next=s;
p->prior=s;
p=p->next;
}
}
voidinitlist()
{
l=newslnode;
l->next=l;
l->prior=l;
}
voidsearch()
{
intj=0,a=0;
linklistp=l;
printf("\n\t\t*****************按姓名查找*******************");
charname[8];
printf("\n\t\t请输入姓名:
");
scanf("%s",name);
for(inti=a;inext)
{
if(strcmp(name,p->next->date.name)==0)
{
printf("查询到的信息:
");
printf("\n");
printf("姓名:
");
printf("%s",p->next->date.name);
printf("\n");
printf("编号:
");
printf("%s",p->next->date.num);
printf("\n");
printf("地址:
");
printf("%s",p->next->date.address);
printf("\n");
printf("性别:
");
printf("%s",p->next->date.sex);
printf("\n");
printf("电话:
");
printf("%s",p->next->date.tel);
j++;
}
if(j==0)
printf("\t\t该通讯录没有该人!
");
if((i+1){
printf("\n\t\t是否继续查找相同名字的学生信息:
(y/n)");
if(getch()=='y')
{
a=i;
continue;
}
else
return;
}
else
{
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
}
voiddelet()
{
inta=0;
intfindmark=0;
intj;
intdeletemark=0;
inti;
charname[8];
printf("\n\t\t请输入要删除学生姓名:
");
scanf("%s",name);
for(i=a;i{
if(strcmp(student[i].name,name)==NULL)
{
printf("\n\t\t以下是您要删除的学生纪录:
");
findmark++;
printf("\n\t\t________________________________");
printf("\n\t\t姓名:
%s",student[i].name);
printf("\n\t\t性别:
%s",student[i].sex);
printf("\n\t\t编号:
%s",student[i].num);
printf("\n\t\t电话:
%s",student[i].tel);
printf("\n\t\t地址:
%s",student[i].address);
printf("\n\t\t________________________________");
printf("\n\t\t是否删除?
(y/n)");
if(getch()=='y')
{
for(j=i;jstudent[j]=student[j+1];
num--;
deletemark++;
printf("\n\t\t删除成功");
if((i+1){
printf("\n\t\t是否继续删除相同姓名的同学信息?
(y/n)");
if(getch()=='y')
{
a=i;
continue;
}
}
printf("\n\t\t是否继续删除?
(y/n)");
if(getch()=='y')
delet();
return;
}
if((i+1){
printf("\n\t\t是否继续删除相同姓名的同学信息?
(y/n)");
if(getch()=='y')
{
a=i;
continue;
}
}
}
else
continue;
}
if((deletemark==0)&&(findmark==0))
{
printf("\n\t\t没有该同学的纪录");
return;
}
else
if(findmark!
=0)
{
printf("\n\t\t没有重名信息");
printf("\n\t\t没有该同学的纪录");
return;
}
}
仓库管理系统
•一、题目内容的描述
设计一个仓库管理系统,可以按照顺序和货物名称查询仓库的存储情况,也可以增加或删除货物。
structnode
{
intNO;//商品编号
charname[max];//商品名称
intcount;//商品数量
};
•二、应用程序功能的详细说明
利用链式表存储仓库信息,可以完成简单的排序、查询、插入、删除物品数据。
•三、输入数据类型、格式和内容限制;
数据输入类型商品编号int整型,商品名称char字符,数量用int整型。
•四、主要模块的算法描述
利用链式表定义双结构体定义双节点
Typedefstruct{
charname[10];
intNO;
intcount;
}Store;
typedefstructnode{
Storeelem;
structnode*next;
}In;
储存商品信息,利用菜单函数menu();建立用户界面:
1-数据初始化
2-创建数据表
3-数据插入
4-数据删除
5-数据更新
6-数据查询
7-编号升序
w-数据保存
r-数据读出
0-系统推出(exit)
利用循环创建仓库信息:
for(i=0;is=Init();
printf("名称编号数量\n");
scanf("%s",&s->elem.name);
scanf("%d",&s->elem.NO);
scanf("%d",&s->elem.count);
p->next=s;
p=s;
利用交换法排序:
for(p1=head->next;p1->next!
=NULL;p1=p1->next)
for(p2=p1->next;p2!
=NULL;p2=p2->next)
if(p1->elem.NO>p2->elem.NO){
p3->elem=p1->elem;
p1->elem=p2->elem;
p2->elem=p3->elem;
}
实验结果截图:
仓库管理系统:
创建:
插入:
插入之后:
排序(按编号升序):
删除:
删除后:
•五、结束语
仓库管理系统让我再次体验到了链表的操作方便和强大。
•六、程序的源代码清单
#include
#include
#include
#include
#include
#defineSIZE100
typedefstruct{
charname[10];
intNO;
intcount;
}Store;
typedefstructnode{
Storeelem;
structnode*next;
}In;
In*head=NULL;
voidappendInfo();
voidList();
voidmenu(void);
In*Init();
voidStart();
voidInsert();
voidDel();
voidrenew();
voidWsave();
voidRead();
voidSortUp();
voidPreFile();
intmain(){
charselect;
PreFile();
menu();
while((select=toupper(getch()))!
='0'){
system("cls");
switch(select)
{
case'1':
{
Start();system("pause");menu();
break;
}
case'2':
{
appendInfo();system("pause");menu();
break;
}
case'3':
{
Insert();system("pause");menu();
break;
}
case'4':
{
Del();system("pause");menu();
break;
}
case'5':
{
renew();system("pause");menu();
break;
}
case'6':
{
List();system("pause");menu();
break;
}
case'7':
{
SortUp();system("pause");menu();
break;
}
case'W':
{
Wsave();
system("pause");
menu();
break;
}
case'R':
{
Read(