电子地图管理系统Word格式.docx
《电子地图管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《电子地图管理系统Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
//创建一个结点
a=time(NULL);
strftime(Run_time,79,"
%H:
%M:
%S"
localtime(&
a));
temp_head=head;
if(temp_head==NULL)
{
printf("
无数据源"
system("
pause"
exit(5);
}
while(temp_head!
=NULL){
if(temp_head->
stRoadRec.linkid==Class){
end=(Road*)malloc(sizeof(Road));
#linkid=%d"
temp_head->
stRoadRec.LinkID);
roadnameflag=%d"
stRoadRec.roadnameflag);
brunch=%d"
stRoadRec.brunch);
dispclass=%d"
stRoadRec.linkid);
roadname=%s#\n"
stRoadRec.roadname);
p->
stRoadRec.LinkID=temp_head->
stRoadRec.LinkID;
stRoadRec.roadnameflag=temp_head->
stRoadRec.roadnameflag;
stRoadRec.brunch=temp_head->
stRoadRec.brunch;
stRoadRec.linkid=temp_head->
stRoadRec.linkid;
stRoadRec.roadname=temp_head->
stRoadRec.roadname;
next=end;
p=p->
next;
i++;
}
temp_head=temp_head->
end->
next=NULL;
p->
if(i>
=5)
save(prev);
查询结果数大于5,已保存至SearchResult.txt\n"
b=time(NULL);
b));
本次查找用时%d秒.\n"
b-a);
voidSearchById(Road*head)
inti=0,LinkId;
请输入您所要查找的道路的ID:
LinkId);
exit(3);
stRoadRec.LinkID==LinkId){
temp_head=temp_head->
voidSearchByName(Road*head)
inti=0;
charName[30];
请输入您所要查找的道路的名称:
%s"
Name);
exit(6);
if(strcmp(temp_head->
stRoadRec.roadname,Name)==0){
voidupdata(Road*head)
FILE*pp;
FILE*ppp;
FILE*infile;
FILE*outfile;
time_ta;
charfilename[20];
Road*p1;
Road*p2;
pp=fopen("
newfile.txt"
"
w"
if(pp==NULL)
文件创建失败\n"
exit
(1);
}//判断文件是否创建成功//
p1=head;
if(p1==NULL)
空指针\n"
}//判断头指针是否为空//
while(p1!
=NULL)
fprintf(pp,"
%d%d%d%s%d%d"
p1->
stRoadRec.data_size,p1->
stRoadRec.LinkID,p1->
stRoadRec.road_size,p1->
stRoadRec.roadname,p1->
stRoadRec.brunch,p1->
p1=p1->
fclose(pp);
//将动态链表中的内容写入文件newfile中//
strcpy(filename,"
update.dat"
infile=fopen("
jilu.txt"
fscanf(infile,"
%d%s"
a,&
filename);
//将时间和update.dat都写入文件中//
outfile=fopen("
r"
if(outfile==NULL)
fprintf(outfile,"
filename);
//将文件中的内容读出来作为文件名//
fclose(outfile);
//将时间加入到文件名中,使更新后之前的文件内容不会被覆盖//
ppp=fopen(filename,"
wb"
if(ppp==NULL)
更新文件创建失败\n"
p2=head;
while(p2!
fwrite(p2,sizeof(Road),1,ppp);
p2=p2->
文件更新中...\n"
文件更新成功\n"
fclose(ppp);
//文件更新完毕,将排序后的内容写入文本文件和二进制文件中//
voidSearchByBruch(Road*head)
inti=0,Bruch;
请输入您所要查找的道路的岔路数:
Bruch);
p=(Road*)malloc(sizeof(Road));
prev=p;
exit(4);
stRoadRec.brunch==Bruch)
{
}
i的结果是%d\n"
i);
Road*readfile(void)
FILE*fp;
unsignedshorttemp_data_size[1];
//数据大小2bytebuff
unsignedinttemp_LinkID[1];
//道路编号4bytebuff
unsignedshorttemp_road_size[1];
//道路名称的尺寸2bytebuff
unsignedinttemp_info[1];
//道路信息4bytebuff
chartemp_name[5000];
//GTBL.dat不存在就输入
char*p_name;
//道路名称指针
Road*head,*pCur,*pEnd;
pCur=(Road*)malloc(sizeof(Road));
head=pCur;
fp=fopen("
GTBL.dat"
rb+"
if(fp==NULL)
错误:
不能打开GTBL.dat\n"
looperror:
\n请输入你要打开的文件名\n"
scanf("
temp_name);
fp=fopen(temp_name,"
if(fp==NULL)
不能打开%s"
gotolooperror;
else
读取成功\n"
while
(1)
pEnd=(Road*)malloc(sizeof(Road));
fread(temp_data_size,sizeof(unsignedshort),1,fp);
pCur->
stRoadRec.data_size=M_CHG_INT16(temp_data_size[0]);
//printf("
pCur->
stRoadRec.data_size);
fread(temp_LinkID,sizeof(unsignedint),1,fp);
stRoadRec.LinkID=M_CHG_INT32(temp_LinkID[0]);
fread(temp_road_size,sizeof(short),1,fp);
stRoadRec.road_size=M_CHG_INT16(temp_road_size[0]);
fread(temp_info,sizeof(unsignedint),1,fp);
temp_info[0]=M_CHG_INT32(temp_info[0]);
stRoadRec.linkid=(0xf&
temp_info[0]);
stRoadRec.brunch=((0x70&
temp_info[0])>
>
4);
stRoadRec.roadnameflag=((0x80&
7);
if(pCur->
stRoadRec.roadnameflag==1)
stRoadRec.roadname=(char*)malloc(pCur->
stRoadRec.data_size-12);
p_name=(char*)malloc(pCur->
fread(pCur->
stRoadRec.roadname,(pCur->
stRoadRec.data_size-12),1,fp);
//pCur->
stRoadRec.roadname=p_name;
stRoadRec.roadname=NULL;
if(feof(fp))
break;
next=pEnd;
pCur=pCur->
returnhead;
voidQListSort(Road**head,Road*end)
Road*right;
Road**left_walk,**right_walk;
Road*pivot,*old;
intcount,left_count,right_count;
if(*head==end)
return;
do
pivot=*head;
left_walk=head;
right_walk=&
right;
left_count=right_count=0;
//取第一个节点作为比较的基准,小于基准的在左面的子链表中,
//大于基准的在右边的子链表中
for(old=(*head)->
old!
=end;
old=old->
next)
if(old->
stRoadRec.LinkID<
pivot->
stRoadRec.LinkID)//小于基准,加入到左面的子链表,继续比较
++left_count;
*left_walk=old;
//把该节点加入到左边的链表中,
left_walk=&
(old->
next);
else//大于基准,加入到右边的子链表,继续比较
++right_count;
*right_walk=old;
//合并链表
*right_walk=end;
//结束右链表
*left_walk=pivot;
//把基准置于正确的位置上
next=right;
//把链表合并
//对较小的子链表进行快排序,较大的子链表进行迭代排序。
if(left_walk>
right_walk)
QListSort(&
(pivot->
next),end);
end=pivot;
count=left_count;
else
QListSort(head,pivot);
head=&
count=right_count;
while(count>
1);
Road*BubbleSort(Road*head)
Road*endpt;
/*控制循环比较*/
Road*p;
/*临时指针变量*/
Road*p1;
Road*p2;
p1=(Road*)malloc(sizeof(Road));
p1->
next=head;
/*注意理解:
我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。
因为第一个节点没有前驱,我们不能交换地址。
*/
head=p1;
/*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/
for(endpt=NULL;
endpt!
=head;
endpt=p)/*结合第6点理解*/
for(p=p1=head;
next->
next!
=endpt;
p1=p1->
if(p1->
stRoadRec.LinkID>
stRoadRec.LinkID)/*如果前面的节点键值比后面节点的键值大,则交换*/
p2=p1->
/*结合第1点理解*/
nex