/*寻找被删除结点i的前驱结点i-1使p指向它*/
{p=p->link;
j=j+1;
}
if(j!
=i-1)
{printf(“删除结点的位置i不合理!
”)
returnERROR;
}
q=p->link;
p->link=q->link;
free(q);/*释放被删除的结点所占的内存空间*/
returnOK;
}
○3链表的查找操作是指从某个已经存在的链表中根据给定的条件寻找符合条件的结点。
其算法如下:
Node*Locate(Linkl,charfindmess[],charaddressornum[])/*查找子函数*/
{
Node*r;
if(strcmp(addressornum,"num")==0)/*与比较楼号相同*/
{
r=l->next;
while(r!
=NULL)/*不是尾结点*/
{
if(strcmp(r->data.num,findmess)==0)/*比较相同*/
returnr;/*返回结点信息*/
r=r->next;/*查找下一个结点*/
}
}
elseif(strcmp(addressornum,"address")==0)/*与比较楼宇地址相同*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.address,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
函数的调用关系图
3.调试分析
a、调试中遇到的问题及对问题的解决方法
由于在输入程序时中英文切换频繁,导致“;”输入错误,运行时出现不能识别字符。
源程序中含有文件调用(fp=fopen("C:
\\building","wb");)目前还不会将文件镜像到程序目录),因此每次启动程序需创建“C:
\\building”,再运行一次,文件成功建立。
当时直接就运行了,结果运行时无法成功创建,按上述说法改了一下便成功了。
b、算法的时间复杂度和空间复杂度
整个程序转为EXE可执行后整体的空间复杂度为196KB。
链表的插入、删除、查找操作的时间复杂度都为O(n)。
4.测试结果
(1)学生宿舍楼宇信息的输入
(2)删除操作(按楼号删除)
(3)查询学生宿舍楼宇信息(按楼号查询)
(4)修改学生宿舍楼宇信息
(5)显示管辖区域信息
(6)显示公寓楼信息
(7)保存公寓楼信息
(8)显示公寓宿舍信息
(9)统计学生宿舍楼宇信息
5.源程序(带注释)
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
intshoudsave=0;
structbuilding/*定义结构体*/
{
charnum[10];/*楼号*/
charaddress[20];/*地址*/
chartotal[30];/*楼宇总数*/
charE_dormitory[50];/*空宿舍数*/
charfloor[4];/*楼层数*/
charD_total[30];/*每层宿舍数*/
charroomnum[10];/*宿舍号*/
charD_telephone[20];/*宿舍电话*/
charrenshu[10];/*宿舍容纳人数*/
charmember[30];/*宿舍成员*/
};
typedefstructnode/*线性单链表的存储结构*/
{
structbuildingdata;
structnode*next;
}Node,*Link;
voidmenu()
{
printf("********************************************************************************");
printf("\t1输入学生宿舍楼宇信息\t\t\t2删除学生宿舍楼宇信息\n");
printf("\t3查询学生宿舍楼宇信息\t\t\t4修改学生宿舍楼宇信息\n");
printf("\t5显示管辖区域信息\t\t\t6显示公寓楼信息\n");
printf("\t7保存公寓楼信息\t\t\t8显示公寓宿舍信息\n");
printf("\t9统计学生宿舍楼宇信息\t\t\t10退出系统\n");
printf("********************************************************************************\n");
}
voidprintstart()/*分隔线子函数*/
{
printf("--------------------------------------------------------------------------------\n");
}
voidWrong()/*错误信息子函数*/
{
printf("\n=====>提示:
输入错误!
\n");
}
voidNofind()/*信息查找失败子函数*/
{
printf("\n=====>提示:
没有找到该公寓楼!
\n");
}
voidprintc()/*管辖区域信息标题子函数*/
{
printf("楼号\t地址\t楼宇总数\n");
}
voidprinte(Node*p)/*管辖区域信息输出子函数*/
{
printf("%s\t%s\t%s\t\n",p->data.num,p->data.address,p->data.total);
}
voidprintb()
{printf("公寓楼信息:
\n");}/*公寓楼信息子函数*/
voidprintx()/*公寓楼信息标题子函数*/
{printf("楼号\t地址\t空宿舍数\t楼层数\t每层宿舍数\t\n");}
voidprintd(Node*p)/*公寓楼信息输出子函数*/
{
printf("%s\t%s\t%s\t%s\t%s\t\n",p->data.num,p->data.address,p->data.E_dormitory,p->data.floor,p->data.D_total);}
voidprinta()
{printf("公寓宿舍信息:
\n");}/*公寓宿舍信息子函数*/
voidprinty()/*公寓宿舍信息标题子函数*/
{printf("楼号\t地址\t宿舍号\t宿舍电话\t宿舍容纳人数\t宿舍成员\t\n");}
voidprinti(Node*p)/*公寓宿舍信息输出子函数*/
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",p->data.num,p->data.address,p->data.roomnum,p->data.D_telephone,p->data.renshu,p->data.member);
}
Node*Locate(Linkl,charfindmess[],charaddressornum[])/*查找子函数*/
{
Node*r;
if(strcmp(addressornum,"num")==0)/*与比较楼号相同*/
{
r=l->next;
while(r!
=NULL)/*不是尾结点*/
{
if(strcmp(r->data.num,findmess)==0)/*比较相同*/
returnr;/*返回结点信息*/
r=r->next;/*查找下一个结点*/
}
}
elseif(strcmp(addressornum,"address")==0)/*与比较楼宇地址相同*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.address,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
voidAdd(Linkl)/*学生宿舍楼宇信息输入子函数*/
{
Node*p,*r,*s;
charnum[10];
r=l;
s=l->next;
while(r->next!
=NULL)
r=r->next;
while
(1)
{
printf("请你输入楼号(以'0'返回上一级菜单:
)");
scanf("%s",num);
if(strcmp(num,"0")==0)/*检验输入值是否为0*/
break;
while(s)
{
if(strcmp(s->data.num,num)==0)/*检验输入值是否已存在*/
{
printf("=====>提示:
楼号为'%s'的公寓楼已经存在,若要修改请你选择'4'修改!
\n",num);
printstart();/*调用分隔线子函数*/
printc();/*调用管辖区域信息标题子函数*/
printe(s);/*调用管辖区域信息输出子函数*/
printstart();
printf("\n");
return;
}
s=s->next;/*进行循环*/
}
p=(Node*)malloc(sizeof(Node));
strcpy(p->data.num,num);/*复制函数*/
printf("请您输入地址:
");
scanf("%s",&p->data.address);
getchar();
printf("请您输入楼宇总数:
");
scanf("%s",&p->data.total);
getchar();
printf("请您输入空宿舍数:
");
scanf("%s",&p->data.E_dormitory);
getchar();
printf("请您输入楼层数:
");
scanf("%s",&p->data.floor);
getchar();
printf("请您输入每层宿舍数:
");
scanf("%s",&p->data.D_total);
getchar();
printf("请您输入宿舍号:
");
scanf("%s",&p->data.roomnum);
getchar();
printf("请您输入宿舍电话:
");
scanf("%s",&p->data.D_telephone);
getchar();
printf("请您输入宿舍容纳人数:
");
scanf("%s",&p->data.renshu);
getchar();
printf("请您输入宿舍成员:
");
scanf("%s",&p->data.member);
getchar();
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;/*信息未保存标志*/
}
}
voidQur(Linkl)/*学生宿舍楼宇信息查询子函数*/
{
intsel;
charfindmess[20];
Node*p;
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以查询!
\n");
return;
}
printf("\n=====>按楼号查找\n");
scanf("%d",&sel);
if(sel==1)/*按楼号查找*/
{
printf("请您输入要查找的楼号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找结果\n");
printstart();
printc();/*调用管辖区域信息标题子函数*/
printe(p);/*调用管辖区域信息输出子函数*/
printb();/*调用公寓楼信息子函数*/
printx();/*调用公寓楼信息标题子函数*/
printd(p);/*调用公寓楼信息输出子函数*/
printa();/*调用公寓宿舍信息子函数*/
printy();/*调用公寓宿舍信息标题子函数*/
printi(p);/*调用公寓宿舍信息输出子函数*/
printstart();/*调用分隔线子函数*/
}
else
Nofind();/*调用信息查找失败子函数*/
}
else
Wrong();
}
voidDel(Linkl)/*删除学生宿舍楼宇信息子函数*/
{
intsel;
Node*p,*r;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>提示:
没有信息可以删除!
\n");
return;
}
printf("\n=====>1按楼号删除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("请您输入要删除的楼号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");/*调用查找子函数*/
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:
该楼宇已经成功删除!
\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
voidModify(Linkl)/*修改学生宿舍楼宇信息子函数*/
{
Node*p;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>提示:
没有信息可以修改!
\n");
return;
}
printf("请您输入要修改的楼号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");/*调用查找子函数*/
if(p)
{
printf("请您输入新楼号(原来是%s):
",&p->data.num);
scanf("%s",&p->data.num);
getchar();
printf("请您输入新地址(原来是%s):
",&p->data.address);
scanf("%s",&p->data.address);
getchar();
printf("请您输入新楼宇总数(原来是%s):
",&p->data.total);
scanf("%s",&p->data.total);
getchar();
printf("请您输入新的空宿舍数(原来是%s):
",&p->data.E_dormitory);
scanf("%s",&p->data.E_dormitory);
getchar();
printf("请您输入新的楼层数(原来是%s):
",p->data.floor);
scanf("%s",&p->data.floor);
getchar();
printf("请您输入新的每层宿舍数(原来是%s):
",&p->data.D_total);
scanf("%s",&p->data.D_total);
getchar();
printf("请您输入新的宿舍号(原来是%s):
",&p->data.roomnum);
scanf("%s",&p->data.roomnum);
getchar();
printf("请您输入新的宿舍电话(原来是%s):
",&p->data.D_telephone);
scanf("%s",&p->data.D_telephone);
getchar();
printf("请您输入新的宿舍容纳人数(原来是%s):
",&p->data.renshu);
scanf("%s",&p->data.renshu);
getchar();
printf("请您输入新的宿舍成员(原来是%s):
",&p->data.member);
scanf("%s",&p->data.member);
getchar();
printf("\n=====>提示:
信息修改成功!
\n");
shoudsave=1;
}
else
Nofind();
}
voidDisp(Linkl)/*管辖区域信息浏览子函数*/
{
intcount=0;
Node*p;
p=l->next;
if(!
p)
{
printf("\n=====>提示:
没有信息可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
voidlouyu(Linkl)/*公寓楼信息浏览子函数*/
{
Node*p;
p=l->next;
if(!
p)
{
printf("\n=====>提示:
没有信息可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printb();
printx();
printf("\n");
while(p)
{
printd(p);
p=p->next;
}
printstart();
printf("\n");
}
voidsushe(Linkl)/*公寓宿舍信息浏览子函数*/
{
Node*p;
p=l->next;
if(!
p)
{
printf("\n=====>提示:
没有信息可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printa();
printy();
pr