实现导航系统

学习了一学期的数据结构的课设报告,这里主要发出我的代码及帮助读者理解的部分实验报告,写的不好之处还望提出改进继续优化。

后面直接一次性给出了完整代码,方便各位读者直接分享使用、方便移植。

也没有给代码添加过多的详细注释,因为像这种完全用面向过程的c语言写出的东西各部分之间的调用关系也不是很深,只有个别的算法可能需要好好研究一番。


目录

一、所用知识

(1)必掌握

(2)算法

二、实现功能

三、程序结构

四、main函数流程

五、数据存储结构设计

(1)图结构

(2)链表结构 

六、完整代码

七、运行实例


一、所用知识

(1)必掌握

  • C语言
  • 链表
  • 递归

(2)算法

  • DFS(深度优先搜索)
  • 链表的初始化、添加删除结点、清空、遍历、复制链表
  • 迪杰斯特拉算法
  • 构造邻接矩阵

二、实现功能

三、程序结构

四、main函数流程

 

五、数据存储结构设计

(1)图结构

typedef enum{DG,DN,UDG,UDN}GraphKind;//要定义图的类型选择
typedef struct ArcNode
{
    int adj; 		//图的权值
    char * info; 	//顶点的相关信息,不过此程序中并未使用此处的定义
}ArcNode;

typedef struct 
{
    int xi;			//图的顶点在数组中的下标的记录
    char vi;			//图的顶点的代号
    char ki[500];	//顶点的相关信息描述
}VertexType;

typedef struct {
    VertexType vertex[MAX_VERtEX_NUM]; 
	    //存放顶点的数组
    ArcNode arcs[MAX_VERtEX_NUM][MAX_VERtEX_NUM];
       //图的邻接矩阵
    int vexnum,arcnum; 
       //顶点和边的定义
    GraphKind kind; 
       //图的种类,此程序中创建的时无向有权网(UDN)
}AdjMatrix;

(2)链表结构 

typedef struct Node
{
    char data;			//结点的相关信息(存储的A、B、C···)
    struct Node *next;  //next指针域
}Node,*LinkList;	    //Node用于sizeof探测空间大小
                        //LinkList用于定义指针类型

六、完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_VERtEX_NUM 20 
#define INFINITY 32786                 
#define Error -1;
#define True 1     
#define False 0 
int visited[MAX_VERtEX_NUM];
int stack[MAX_VERtEX_NUM];
int end,top=0,start=0;

//图结构
typedef enum{DG,DN,UDG,UDN}GraphKind;      
typedef struct ArcNode
{
    int adj;                         
    char * info;                      
}ArcNode;
typedef struct 
{
    int xi;
    char vi;
    char ki[500];
}VertexType;
typedef struct {
    VertexType vertex[MAX_VERtEX_NUM];       
    ArcNode arcs[MAX_VERtEX_NUM][MAX_VERtEX_NUM];
    int vexnum,arcnum;                      
    GraphKind kind;                        
}AdjMatrix;

//链表结构
typedef struct Node
{
    char data;
    struct Node *next;
}Node,*LinkList;

LinkList Path[MAX_VERtEX_NUM];
int Dist[MAX_VERtEX_NUM];

void Init_List(LinkList *L)//初始化链表
{
    *L=(LinkList)malloc(sizeof(Node));//创建头节点
    (*L)->next=NULL;
}

void AddTail(LinkList *L,char i)//尾插法加结点
{
    Node *p,*q;
    q=(*L);
    while(q->next!=NULL){
        q=q->next;
    }
    p=(LinkList)malloc(sizeof(Node));
    if(p){
        p->data=i;
        p->next=NULL;
        q->next=p;
    }
}

int Member(char ver,LinkList s) //判断ver是否在链表s中
{
    Node *temp;
    temp=s->next;
    while(temp!=NULL){
        if(temp->data==ver)
            return True;
        temp=temp->next;
    }
    return False;

}

void Clear_Link(LinkList *L)//清空链表
{
    Node *temp,*del;
    temp=(*L);
    while(temp->next!=NULL){
        del=temp->next;
        temp->next=del->next;
        free(del);
    }
}

void CopyPath(LinkList *T,LinkList *S)  //把s复制到t中
{
    Node *s,*t,*add;
    t=(*T);
    s=(*S)->next;
    Clear_Link(T);
    while(s!=NULL){
        add=(LinkList)malloc(sizeof(Node));
        if(add){
            add->data=s->data;
            add->next=t->next;
            t->next=add;
            s=s->next;
            t=t->next;
        }

    }
}

void ShortestPath_DIJ(AdjMatrix G,int v0) 
{
	int i,k,t,min;
    LinkList s;//最小路径集
    for(i=0;i<G.vexnum;i++)
    {
        Init_List(&Path[i]);//初始化最初路径
        Dist[i]=G.arcs[v0][i].adj;
        if(Dist[i]<INFINITY)//如果有路径,加入
        {
            AddTail(&Path[i],G.vertex[v0].vi);
            AddTail(&Path[i],G.vertex[i].vi);
        }
    }
    Init_List(&s);//初始化S集
    AddTail(&s,G.vertex[v0].vi);//将起始点加入S集
    for(t=1;t<G.vexnum;t++)//循环M->vertexnum-1次
    {
        min=INFINITY;
        for(i=0;i<G.vexnum;i++){
            if(!Member(G.vertex[i].vi,s)&&Dist[i]<min){//节点i不在S集并且起始点到i的路径长度小于S集中最小值
                k=i;
                min=Dist[i];
            }
        }
        if(min==INFINITY)   return;
        AddTail(&s,G.vertex[k].vi);
        for(i=0;i<G.vexnum;i++){
            if(!Member(G.vertex[i].vi,s)&&G.arcs[k][i].adj!=INFINITY&&(Dist[k]+G.arcs[k][i].adj<Dist[i])){
                Dist[i]=Dist[k]+G.arcs[k][i].adj;
                CopyPath(&Path[i],&Path[k]);
                //Path[i]=Path[k];
                AddTail(&Path[i],G.vertex[i].vi);
            }
        }
    }
}

void print_minpath(LinkList L)//打印全部最小路径
{
    Node *temp,*p;
    p=L->next;
    temp=p->next;
    printf(" %c",p->data);
    while(temp!=NULL){
        printf("->%c",temp->data);
        temp=temp->next;
    }
    printf("\n");
}

void print_minpath2(LinkList L)//打印单条最小路径
{
    Node *temp,*p;
    p=L->next;
    temp=p->next;
    printf("%c",p->data);
    while(temp!=NULL){
        printf("->%c",temp->data);
        temp=temp->next;
    }
    printf("\n");
}

void print_MinPaths(AdjMatrix *G,char v0)   //遍历Path
{
    for(int i=0;i<G->vexnum;i++){
        if(i!=v0){
            print_minpath(Path[i]);
        }
    }
}

void Print_Dist(int dist[],int v0,int vex_num)//打印距离
{
    int i;
    for(i=0;i<vex_num;i++){
        printf("*");
        if(i!=v0){
            if(Dist[i]==INFINITY){
                printf("%d ",-1);
            }else{
                printf("%d ",Dist[i]);
            }

        }
    }
}

int LocateVertex(AdjMatrix *G,char v)//搜索该顶点在数组中的位置
{
    int j=Error;
    for(int k=0;k<G->vexnum;k++)
        if(G->vertex[k].vi==v)
            {j=k;break;}
    return(j);
}

void CreateUDN(AdjMatrix *G){       //构造无向有权网
    G->vexnum=10,G->arcnum=18;
    G->vertex[0].vi='A';
    G->vertex[0].xi=0;
    strcpy(G->vertex[0].ki,"校门:建于1912年,是学校的重要标志,一般可控制人员和车辆出入");
    G->vertex[1].vi='B';
    G->vertex[1].xi=1;
    strcpy(G->vertex[1].ki,"教学楼:教学楼就是学校教学区的主体建筑。教学区一般采取以教学楼为主体的布局。教学楼一般分为教学单元、实验单元和办公单元等。");
    G->vertex[2].vi='C';
    G->vertex[2].xi=2;
    strcpy(G->vertex[2].ki,"人文楼:人文学科的综合功能大楼。即文学、哲学、国学、历史 艺术、美学、教育、社会等学科,包括教学、科研、办公、会议、图书阅览等综合功能大楼。");
    G->vertex[3].vi='D';
    G->vertex[3].xi=3;
    strcpy(G->vertex[3].ki,"图书馆:是搜集、整理、收藏图书资料以供人阅览、参考的机构");
    G->vertex[4].vi='E';
    G->vertex[4].xi=4;
    strcpy(G->vertex[4].ki,"大学生活动中心:是大学设立的组织指导大学生进行文化艺术娱乐活动,丰富大学生课余生活的场所。");
    G->vertex[5].vi='F';
    G->vertex[5].xi=5;
    strcpy(G->vertex[5].ki,"学生公寓:是学生日常生活与学习的重要场所,是课堂之外对学生进行政治思想工作和素质教育的重要阵地。");
    G->vertex[6].vi='G';
    G->vertex[6].xi=6;
    strcpy(G->vertex[6].ki,"操场:建有标准的8跑道塑胶运动场,可供学生进行体育比赛以及娱乐活动");
    G->vertex[7].vi='H';
    G->vertex[7].xi=7;
    strcpy(G->vertex[7].ki,"食堂:学校食堂比较规范,相对企业食堂还是比较讲究菜色和卫生服务的,一般都经过单位监督和经营认证。");
    G->vertex[8].vi='I';
    G->vertex[8].xi=8;
    strcpy(G->vertex[8].ki,"菜鸟驿站:是一个由菜鸟网络牵头建立面向社区和校园的物流服务平台网络平台,作为菜鸟网络五大战略方向之一为网购用户提供包裹代收服务,");
    G->vertex[9].vi='J';
    G->vertex[9].xi=9;
    strcpy(G->vertex[9].ki,"田径运动场:是一类开展体育运动场地。有若干条跑道,中央有可供设计球类运动场地,两侧和两端有可供修建沙坑和一些投掷区的空底。");
    for(int i=0;i<G->vexnum;i++){
        for(int j=0;j<G->vexnum;j++){
            G->arcs[i][j].adj=INFINITY;
            G->arcs[i][j].info=NULL;
        }
    }

    char v1,v2;int i,j,w;
    i=LocateVertex(G,'A');
	j=LocateVertex(G,'B');
	w=150;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w; 
    
	i=LocateVertex(G,'A');
	j=LocateVertex(G,'C');
	w=200;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'A');
	j=LocateVertex(G,'D');
	w=400;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'A');
	j=LocateVertex(G,'E');
	w=600;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'B');
	j=LocateVertex(G,'D');
	w=150;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'B');
	j=LocateVertex(G,'C');
	w=300;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'C');
	j=LocateVertex(G,'D');
	w=210;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'C');
	j=LocateVertex(G,'F');
	w=300;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'D');
	j=LocateVertex(G,'E');
	w=120;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
    
    i=LocateVertex(G,'D');
	j=LocateVertex(G,'F');
	w=250;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'E');
	j=LocateVertex(G,'G');
	w=100;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'F');
	j=LocateVertex(G,'G');
	w=350;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'F');
	j=LocateVertex(G,'I');
	w=250;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'F');
	j=LocateVertex(G,'J');
	w=150;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'G');
	j=LocateVertex(G,'H');
	w=50;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'G');
	j=LocateVertex(G,'I');
	w=200;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'H');
	j=LocateVertex(G,'I');
	w=30;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;

    i=LocateVertex(G,'I');
	j=LocateVertex(G,'J');
	w=200;
	G->arcs[i][j].adj=w;           
    G->arcs[j][i].adj=w;
}

void PrintGrapth(AdjMatrix G)       //输出邻接矩阵
{
    for (int i=0;i<G.vexnum;i++){
        for (int j=0;j<G.vexnum;j++){
            printf("%d\t",G.arcs[i][j].adj);
        }
        printf("\n");
    }
}

void DFS(AdjMatrix G,int v0)
{
    printf("%c ",G.vertex[v0].vi);
    visited[v0]=True;
    for(int vj=0;vj<G.vexnum;vj++)
        if(!visited[vj]&&G.arcs[v0][vj].adj!=0)
            DFS(G,vj);
}

void DFS_(AdjMatrix G,int v0,int v)
{
    if(v0==end){
        printf("%c",G.vertex[v].vi);
        for(int i=0;i<top;i++){
            printf("->%c",G.vertex[stack[i]].vi);
        }
        printf("\n");
        return;      
    }
    visited[v]=True;
    for(int vj=0;vj<G.vexnum;vj++){
        if(!visited[vj]&&G.arcs[v0][vj].adj!=0&&G.arcs[v0][vj].adj<INFINITY){
            visited[vj]=True;
            stack[top]=G.vertex[vj].xi;
            top++;
            DFS_(G,G.vertex[vj].xi,v); 
            visited[vj]=False;
            top--;  
        }
       
    } 
}

void fun1(AdjMatrix G)
{
    printf("\n(A)校门[0]~(B)教学楼[1]~(C)人文楼[2]~(D)图书馆[3]~(E)大学生活动中心[4]~(F)学生公寓[5]~(G)操场[6]~(H)食堂[7]~(I)菜鸟驿站[8]~(J)田径场[9]\n");
    printf("\n起始景点位置[输入数字代号]:");
    scanf("%d",&start);
    printf("\n目标景点位置[输入数字代号]:");
    scanf("%d",&end);
    printf("\n最佳路径是:");
    ShortestPath_DIJ(G,start);
    print_minpath2(Path[end]);
    printf("\n距离是:");
    //Print_Dist(Dist,start,G.vexnum);
    printf("%dm\n",Dist[end]);
}

void fun2(AdjMatrix G)
{
    printf("\n(A)校门[0]~(B)教学楼[1]~(C)人文楼[2]~(D)图书馆[3]~(E)大学生活动中心[4]~(F)学生公寓[5]~(G)操场[6]~(H)食堂[7]~(I)菜鸟驿站[8]~(J)田径场[9]\n");
    printf("\n起始景点位置:");
    scanf("%d",&start);
    printf("\n从当前景点到达任意景点最佳路径如下:\n\n");
    ShortestPath_DIJ(G,start);
    print_MinPaths(&G,start);
}

void fun3(AdjMatrix G)
{
    printf("\n(A)校门[0]~(B)教学楼[1]~(C)人文楼[2]~(D)图书馆[3]~(E)大学生活动中心[4]~(F)学生公寓[5]~(G)操场[6]~(H)食堂[7]~(I)菜鸟驿站[8]~(J)田径场[9]\n");
    printf("\n起始景点位置[输入数字代号]:");
    scanf("%d",&start);
    printf("\n目标景点位置[输入数字代号]:");
    scanf("%d",&end);
    printf("\n\n所有路径如下:\n\n");
    DFS_(G,start,start);
}

void fun4(AdjMatrix G)
{
    printf("\n");
    for(int i=0;i<G.vexnum;i++){
        printf("%c ",G.vertex[i].vi);
        printf("%s",G.vertex[i].ki);
        printf("\n");
    }
}

void fun5(AdjMatrix G)
{
    int i;
    printf("\n(A)校门[0]~(B)教学楼[1]~(C)人文楼[2]~(D)图书馆[3]~(E)大学生活动中心[4]~(F)学生公寓[5]~(G)操场[6]~(H)食堂[7]~(I)菜鸟驿站[8]~(J)田径场[9]\n");
    printf("\n输入要查询的景点[输入数字代号]:");
    scanf("%d",&i);
    printf("\n");
    printf("%c ",G.vertex[i].vi);
    printf("%s",G.vertex[i].ki);
    printf("\n");
}

void fun6(AdjMatrix G)
{
    printf("\n");
    PrintGrapth(G);
}

void fun7(AdjMatrix G)
{
    printf("\n");
    DFS(G,0);
    printf("\n");
}

int main()
{
    int i;
    AdjMatrix G;
    CreateUDN(&G);
    memset(visited,False,sizeof(visited));
    putchar('\n');
    system("clear");    //Windows下换成system("cls")

    printf("****************************导航系统****************************\n");
    printf("            查询'任意位置->任意位置'的最佳路径(请输入1)\n");
    printf("            查询'任意位置->所有位置'的最佳路径(请输入2)\n");
    printf("            查询'任意位置->任意位置'的所有路径(请输入3)\n");
    printf("                   查询景点所有信息(请输入4)\n");
    printf("                   查询指定景点信息(请输入5)\n");
    printf("                    查看位置矩阵(请输入6)\n");
    printf("                    遍历所有位置(请输入7)\n");
    printf("                        退出(请输入8)\n");
    printf("****************************导航系统****************************\n");
    
    printf("\n*****选择操作:");
    scanf("%d",&i);
    while(True){
        system("clear");    //Windows下换成system("cls")
        printf("****************************导航系统****************************\n");
        printf("            查询'任意位置->任意位置'的最佳路径(请输入1)\n");
        printf("            查询'任意位置->所有位置'的最佳路径(请输入2)\n");
        printf("            查询'任意位置->任意位置'的所有路径(请输入3)\n");
        printf("                   查询景点所有信息(请输入4)\n");
        printf("                   查询指定景点信息(请输入5)\n");
        printf("                    查看位置矩阵(请输入6)\n");
        printf("                    遍历所有位置(请输入7)\n");
        printf("                        退出(请输入8)\n");
        printf("****************************导航系统****************************\n");
        switch (i)
        {
            case 1:
                fun1(G);
                memset(Path,0,sizeof(Path));
                memset(Dist,0,sizeof(Dist));
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 2:
                fun2(G);
                memset(Path,0,sizeof(Path));
                memset(Dist,0,sizeof(Dist));
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 3:
                fun3(G);
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 4:
                fun4(G);
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 5:
                fun5(G);
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 6:
                fun6(G);
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 7:
                fun7(G);
                printf("\n*****选择操作:");
                scanf("%d",&i);
                break;
            case 8:
                exit(8);
            default:
                break;
        }
    }
    return 0;
}

七、运行实例

(仅提供部分截图)

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
实现简单的查询,各风景的查询,调用各函数,实现课程设计的目标。其中包含三个功能,一个是直接进入导航系统,利用主函数中已有的数据,进行查询:一个是进行创建数据,本程序中初始数据为农大的导航数据,如果需要也可以自己建立一个;最后一个是退出功能。设计该函数的目的是为了能够多次得应用dijkstra函数进行查询最短路径。同时该函数可以列出各景点的代号和对应的名称,这样大家只要输入代号就行了。方便进行查询。下面分别描述这些函数,建立它们函数原型。 1、主函数 函数原型:void main(void) 功 能:控制程序。 参 数:void 返 回 值:void 要 求:管理菜单命令并完成初始化。 2、菜单选择和处理函数 函数原型:int menu() 功 能:处理选择的菜单命令并接收用户选择的命令代码。 参 数:int 返 回 值:int 工作方式:返回命令代码的整数值,根据命令,调用相应函数。 要 求:只允许选择规定键,如果输入不合要求,则提醒用户重新输入。 3、建立邻接矩阵函数 函数原型:void createadj() 功 能:重新建立一个学生信息的记录。 参 数:void 返 回 值:void 工作方式:在需要的时候就可以有主菜单中调用 void createadj()函数。 要 求:必需输入信息记录,然后才能调用出search()函数进行查询。 4、dijkstra函数 函数原型:void dijkstra(intx,inty) 功 能:求两点间的最短路径 参 数:void 返 回 值:void 工作方式: 该函数被其它一些函数调用。 5、结束程序 函数原型:int Exit() 功 能:使程序正常结束运行 参 数:int 返 回 值:1 工作方式:在操作都完成后,可以调用int Exit()函数,使函数最终返回 1 运行exit(1),程序正常结束。 要 求:运行Exit()函数后可以选择是否要保存,选择y则先保存再返 回1值;如果选择n直接返回1值。详细的程序设计应从下到上,在本设计中就要先设计createadj函数;然后设计dijkstra函数;接着是search函数;menu函数;最后才是main函数。如此设计能大大提升设计速度,因为从下往上使编程时的高试过程简单许多,而做课程设计花费时间最多的就是调试过程。对于各函数的详细设计,各函数的N—S图如下: (1)Createadj函数 (2)Dijkstra函数          (3)Search函数          (4)Menu函数          (5)main函数          2.4 程序编码   把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚;编写过程中参考各种的教材和材料,使程序编写的正确性大有提高,同时也许到许多实践知识,增加了实践经验。 2.5 程序调试与测试    程序编写总是出现各种各样的错误,但是难点不是修改错误,而是找出错误。在大量的源程序中找出错误难度很大,但有了一定的方法,就能节省大量的时间,在这次课程设计中我运用的调试方法主要有2种:     一是借助调试工具。利用Turbo C中提供的程序专门调试工具Debugger程序,可以很容易找出程序中的各种语法错误。但是遇到一些逻辑错误时却又无从着手。这时我就用下面一种方法。     二是在程序中插入打印语句。猜测出大致的错误位置,选则一些主要变量,在关键部位插入打印语句,打印出这个主要变量,看其是否与理论上的一样,在多个位置插入,如果有个位置的值与理论值一样,另一个位置与理论值不一样,则错误就落在这两个位置之间,然后再多测试几个位置缩小范围,直到找出错误。  例如;我在调试main()主函数时,程序能够运行,三个选项都能选择,创建函数能够正常运行,也能正常退出,但在选第一条进入校园导航后,打印出来的列表却是空的,源程序中的初始化数据没有显示出来,我又尝试输入两个结点进行查找,发现没有输出路线,所以我猜测初始化数据没有被正常写入。但不知道为何没有被正常写入,首先怀疑是初始化时附值发生错误,查阅各种资料进行校验,发现没有错误。后来经过综合分析,发现最有可能是n值在search()函数中发生错误,于是我在search()函数中插入打印n 的语句,运行后发现输出的n为0,初始化数据中有11个结点,n应该为11,所以n 在这个地方发生错误,我又在main()主函数中打印出n 的值,n=11,是正确的。所以错误就在search()函数中,也就说是当运行case1,运行到search()函数时,n从11变为0,针对这个错误,我把变量n改为宏定义,因为n 是代表结点个数,不管在哪个函数中它的值都是一样的才对。改完后运行程序,成功! 本设计文件的注释如上,已给出详细的说明,下面仅以文件为单位说明各个函数的作用和特点,在必要的地方给予一定说明。  3.1、guide.h文件 使用条件编译。以下是头文件中语句 /********************************************* *头文件(.h) ********************************************/ #include "stdio.h" #include "conio.h" #include "alloc.h" #define n0 100 #define infi 32767 /*“无穷大*/ int adjmatrix[n0+1][n0+1];     /*邻接矩阵*/ int n=11; struct node             /*表结点*/ { char name[20];       /*下一个表结点与它们之间的距离*/ }place[12]={{"ShiDiGongYuan"},   /*表结点初始化,即写各景点名称*/    {"CangRongGongYu"},    {"YinHuiLou"},    {"TuoHuanGuanChang"},    {"DiBaShiTang"},    {"XiaoYiYuan"},    {"TuShuGuan"},    {"TiYuGuan"},    {"ZhongHuaGuanChang"},    {"ChuangXinLou"},    {"YiFuTuShuGuan"},    {"BoXueLou"}};  void createadj()          /*建立邻接表*/  void dijkstra( int x,int y)     /*dijkstra求最小生树*/  void search()            /*搜索最短路径*/  menu()               /*菜单函数*/          /********************************************* *建立邻接表 ********************************************/ void createadj()  
V2.31版本更新说明 1.此次更新的最大亮点是更换最新整体网站主题,较之以前更加细腻养眼! 2.对客户提出的相关BUG进行了修正及优化。 3.网站首页重新排版,更加细化美观。 4.分类页及子页面一并修改,符合首页风格。 5.对部分垃圾网站进行清理! 6.页面代码级后台功能优化! 修改和注意事项: 1.购买后请务必修改一下后台的地址 2.后台的用户名和密码建议10位以上,数字、字母和符号结合 3.修改主页和分类页面等,都是在后台直接修改相应的模板。然后生成一下相应的模版就可以看到。 4.其它没有在后台集成模板的,可以直接修改相应的文件就行。 安全事项: 1,把程序的数据库名进行更改,数据库在data1文件夹内,名称是aqdh.asa(在这个基础上加上一些数字或者字母),改完数据库名后,需要改conn.asp和admin/conn.asp里面对应的数据库名! 2,防止被注入查询的请到后台管理将用户名和密码改成字母加数字8位以上,密码如带"."的更好,这样不易被破解! 3,不要乱安装除本站程序以外其它的程序,因为不能保证他的程序是否安全! 4.默认的安全码更改路径admin文件夹里的psd.asp这个文件,把"123456"这个改成你想要的后台安全验证码。目前默认的后台安全码是123456 ☆安装使用方法☆ 1.解压本软件包,上传到支持ASP的服务器上。 2.数据库文件aqdh.asa,已经做了防下载处理。 3.后台登录地址在admin/index.asp(建议修改一下后台的名称),默认管理员账号:d59258449,密码:twtpfdn。为了更安全,后台密码请设置为带有“.”的密码。 4.进入后台根据提示设置你网站的基本信息。 5.生成全站及分类一次。 6.为了安全起见,请在后台将管理员帐号和密码全部修改成你自己的. ☆系统前台简介☆ 1.申请加入免收录网站友情链接网的网站按最后点进的时间排序首页和分类显示链接, 分类以昨日点入时间为准,每晚十二点后生成静态。 2.每来访一个IP,就会自动排到第一,当天来路不同次数,显示颜色也不同:有1次即显示,10次即套蓝色,30次即套红色加粗 3.首页白天3分钟,晚上5分钟自动更新一次,全站24小时手动更新一次。 4.站内搜索功能。 5.网址库中分离出的【名站导航】【实用工具】【友情链接】 ☆系统后台功能☆ 1.设置网站的基本信息。 2.管理员帐号/密码更改。 3.添加删除分类。 4.分类可修改可设置首页是否显示。 5.酷站可设置首页是否显示。 6.添加删除修改网址内容,是否推荐,是否审核。 7.可从网址库中分离出【名站导航】【实用工具】【友情链接】 8.【名站导航】【实用工具】可由快速通道添加。 9.【友情链接】从网址列表中设置。 10.站内搜索功能。 11.生成htm分类页面,生成htm主页及其它页面。 12.可修改主页,分类及其它页面模板。 13.具有数据库【备份】【压缩】【恢复】功能。 14.后台广告位标注
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晓的雨夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值