页面模拟(进入页面,返回页面)
3.360浏览器的前进后退功能 大家平时都爱上网看新闻、购物等等,你们浏览网页时,有没有类似这样的经历。比如,打开京东网站的笔记本电脑分类,进入页面A,然后点击品牌联想,进入 到页面B,再点击第一种商品,进入页面C,浏览器左上角有前进、后退按钮, 如果点击回退按钮,则退回页面B,再点击回退按钮,退回页面A。如果退到页 面B时没有继续回退,而是打开了新的页面D,则无法返回到页面C了。 请设计算法,模拟实现浏览器中的前进后退功能。
并回答以下问题:
1.你选用了哪种(或哪些)数据结构来实现该功能,这个(些)数据结构的特点 是什么?跟本问题的契合点在哪里?
2.你的程序中采用了哪种存储结构来存放数据结构?说说为何选用该存储结构。
3.给出具体编码与运行结果(包括代码和运行结果的截图)。
选用了哪种(或哪些)数据结构来实现该功能,这个(些)数据结构的特点 是什么?跟本问题的契合点在哪里?
数据结构:
(1)树形结构:存储页面网址或者相关的数据
特点:在页面访问中,每个页面都有自己的子页面,将首次打开的页面当成一个树的根,将这种页面含有子页面的结构就可以看成一棵树,就这样每个树的结点就只需要记录结点的parent结点的编号和网址或地址就行了
这里是静态赋值的一部分
下标 | parent | text[100] 页面网址信息 |
1 | -1 | http//:local_disk.com |
2 | 1 | http//:temp.com |
3 | 1 | http//:Windows.com |
4 | 1 | http//:User.com |
5 | 2 | http//:apollocCache.com |
6 | 2 | http//:openssl_debug.com |
7 | 3 | http//:Boot.com |
8 | 3 | http//:Branding.com |
9 | 4 | http//:GaZhou.com |
10 | 4 | http//:公用.com |
11 | 9 | http//:下载.com |
(2)栈:利用栈来记录被访问过的页面的信息,并用栈的先进后出的特点将访问过的页面进行返回的操作
给出具体编码与运行结果(包括代码和运行结果的截图)。
树的结点结构和栈的结构
typedef char ElemType;
typedef struct{
ElemType visited[CSMAXSIZE][100];
int top;
}FindHistory;
typedef struct csnode//可以用来保存页面
{
ElemType text[100];
//ElemType text;
int parent;
}CSNode,*CSTree;
//*******CSTree树的定义***
访问&&返回(入栈&&出栈)
void pushHistory(FindHistory &s,char arr[])//入栈
{
if(s.top < CSMAXSIZE){
strcpy(s.visited[++s.top],arr);
printf("\n\nOpen the page>>>>>%s<<<<<<<<<---\n",s.visited[s.top]);
}
}
Status popHistory(FindHistory &s,CSTree &T,int i,int flag)//出栈
{
//printf("s.top = %d\n",s.top);
if(s.top <= 0){
printf("\nNOT TO BACK!");
return ERROR;
}
int n;
flag = 1;
s.top--;
printf("\n\nBack The Page-----%s----\n",s.visited[s.top]);
peekHistory(s,T,T[i].parent,flag);
return OK;
}
创建树
//****创建&&赋值***
Status CreatCS_Tree(CSTree &T)
{
T = (CSTree)malloc((CSMAXSIZE)*sizeof(CSNode));
if(!T) return ERROR;
//动态赋值
// for(int i = 1; i < CSMAXSIZE;i++){
// int d;
// printf("输入页面%d所属网址编码\n",i);
// scanf("%d",&d);
// if(d == 0) break;
// T[i].parent = d;
// printf("输入编码为%d页面的网址\n",i);
// scanf("%s",&T[i].text);
// }
// //静态赋值
T[1].parent =-1;strcpy(T[1].text,"http//:local_disk.com");
T[2].parent = 1;strcpy(T[2].text,"http//:temp.com");
T[3].parent = 1;strcpy(T[3].text,"http//:Windows.com");
T[4].parent = 1;strcpy(T[4].text,"http//:User.com");
T[5].parent = 2;strcpy(T[5].text,"http//:apollocCache.com");
T[6].parent = 2;strcpy(T[6].text,"http//:openssl_debug.com");
T[7].parent = 3;strcpy(T[7].text,"http//:Boot.com");
T[8].parent = 3;strcpy(T[8].text,"http//:Branding.com");
T[9].parent = 4;strcpy(T[9].text,"http//:GaZhou.com");
T[10].parent =4 ;strcpy(T[10].text,"http//:公用.com");
T[11].parent = 9;strcpy(T[11].text,"http//:下载.com");
return OK;
}
访问页面
//********访问和返回总函数*******
void peekHistory(FindHistory s,CSTree T,int i,int flag)
{
char arr[100];
strcpy(arr,T[i].text);
if(flag == 0) pushHistory(s,arr);
int data[CSMAXSIZE-1];
int j,k,w;
for(j = 0;j < CSMAXSIZE;j++)
data[j] = 0;
j = 0;
for(k = 1;k < CSMAXSIZE;k++){
if(T[k].parent == i&&i != 0){
data[j++] = k;
printf("\n%d--------%s------------",k,T[k].text);
}
}
int n;
if(data[0] == 0)
printf("---------- Not Found! ----- ('0' To Back)\n");
else printf("\n(Front Number Into The Page)\n('0' To Back)\n");
scanf("%d",&n);
int x;
if(T[n].parent == i) x = 1;
else x = 0;
switch(x)
{
case 1:
for(w = 0;w <= 11;w++){
if(data[w]==n && n != i)
peekHistory(s,T,n,flag);
if(data[w]==0)
break;
}
break;
case 0:
popHistory(s,T,i,flag);
break;
}
}
完整代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define CSMAXSIZE 100
typedef char ElemType;
typedef int Status;
typedef struct{
ElemType visited[CSMAXSIZE][100];
int top;
}FindHistory;
typedef struct csnode//可以用来保存页面
{
ElemType text[100];
//ElemType text;
int parent;
}CSNode,*CSTree;
void InitHistory(FindHistory &s);//初始化栈
void pushHistory(FindHistory &s,char arr[]);//入栈
Status popHistory(FindHistory &s,CSTree &T,int i,int flag);//出栈
Status CreatCS_Tree(CSTree &T);
void peekHistory(FindHistory s,CSTree T,int i,int flag);
int main()
{
CSTree T;
FindHistory s;//栈
InitHistory(s);//初始化栈
CreatCS_Tree(T);//创造树形存储列表
peekHistory(s,T,1,0);//访问页面&&返回页面操作
return OK;
}
void InitHistory(FindHistory &s)//初始化栈
{
s.top = -1;
}
void pushHistory(FindHistory &s,char arr[])//入栈
{
if(s.top < CSMAXSIZE){
strcpy(s.visited[++s.top],arr);
printf("\n\nOpen the page>>>>>%s<<<<<<<<<---\n",s.visited[s.top]);
}
}
Status popHistory(FindHistory &s,CSTree &T,int i,int flag)//出栈
{
//printf("s.top = %d\n",s.top);
if(s.top <= 0){
printf("\nNOT TO BACK!");
return ERROR;
}
int n;
flag = 1;
s.top--;
printf("\n\nBack The Page-----%s----\n",s.visited[s.top]);
peekHistory(s,T,T[i].parent,flag);
return OK;
}
Status CreatCS_Tree(CSTree &T)
{
T = (CSTree)malloc((CSMAXSIZE)*sizeof(CSNode));
if(!T) return ERROR;
//动态赋值
// for(int i = 1; i < CSMAXSIZE;i++){
// int d;
// printf("输入页面%d所属网址编码\n",i);
// scanf("%d",&d);
// if(d == 0) break;
// T[i].parent = d;
// printf("输入编码为%d页面的网址\n",i);
// scanf("%s",&T[i].text);
// }
// //静态赋值
T[1].parent =-1;strcpy(T[1].text,"http//:local_disk.com");
T[2].parent = 1;strcpy(T[2].text,"http//:temp.com");
T[3].parent = 1;strcpy(T[3].text,"http//:Windows.com");
T[4].parent = 1;strcpy(T[4].text,"http//:User.com");
T[5].parent = 2;strcpy(T[5].text,"http//:apollocCache.com");
T[6].parent = 2;strcpy(T[6].text,"http//:openssl_debug.com");
T[7].parent = 3;strcpy(T[7].text,"http//:Boot.com");
T[8].parent = 3;strcpy(T[8].text,"http//:Branding.com");
T[9].parent = 4;strcpy(T[9].text,"http//:GaZhou.com");
T[10].parent =4 ;strcpy(T[10].text,"http//:公用.com");
T[11].parent = 9;strcpy(T[11].text,"http//:下载.com");
return OK;
}
void peekHistory(FindHistory s,CSTree T,int i,int flag)
{
char arr[100];
strcpy(arr,T[i].text);
if(flag == 0) pushHistory(s,arr);
int data[CSMAXSIZE-1];
int j,k,w;
for(j = 0;j < CSMAXSIZE;j++)
data[j] = 0;
j = 0;
for(k = 1;k < CSMAXSIZE;k++){
if(T[k].parent == i&&i != 0){
data[j++] = k;
printf("\n%d--------%s------------",k,T[k].text);
}
}
int n;
if(data[0] == 0)
printf("---------- Not Found! ----- ('0' To Back)\n");
else printf("\n(Front Number Into The Page)\n('0' To Back)\n");
scanf("%d",&n);
int x;
if(T[n].parent == i) x = 1;
else x = 0;
switch(x)
{
case 1:
for(w = 0;w <= 11;w++){
if(data[w]==n && n != i)
peekHistory(s,T,n,flag);
if(data[w]==0)
break;
}
break;
case 0:
popHistory(s,T,i,flag);
break;
}
}
运行结果截图