手机设置代理,访问电脑本地代码

需要fiddler做一个中转

第一步打开fiddler->options

第二步,connections,勾选allow remote computers connect

第三步,打开手机,找到网络设置,一般都是已连wifi后面有一个感叹号,找到代理设置,点击手动,地址就是本机的ip(ipconfig获得),端口和fiddler保持一致,设置成8888。如果是第一次这么设置,重启fiddler,手机访问百度,看是否抓包正确,正确则成功。这样手机的流量就会被代理到fiddler。从而使手机和电脑共用hosts的效果。

网关和路由的区别

今天在看书的时候,突然想到一个问题,网关和路由都具有转发数据的功能,区别是啥呢?

于是上网查了一下,众说纷纭,从中提取了一些信息,做一个自己的理解。

比如在局域网内,两台计算机,ip分别为A:192.168.1.100B:192.16.1.101,如果A向B发送了一组数据,是不需要经过网关的,因为这两台计算机是处于同一个网络里,但是如果你想访问外网,就是不在192,168.1.XXX这个ip段的,那么就需要网关来转发了,A或B会先把数据发给网关,网关再将数据转给对方网络的网关,对方网络的网关再将数据转发给对应的ip,所以网关应该是一个概念,用于连接两个不同网络里的设备。路由器当然可以实现网关的功能。并且路由器还有一些其他的网关,都是实现转发数据和寻找路径的功能。

参考链接:

https://www.zhihu.com/question/21787311?from=profile_question_card

http://blog.csdn.net/fxqcn/article/details/6610182

数据结构 – 反转链表

假如我们已经构造了如下链表:

头结点->6->5->4->3->2->1->null

现在要求反转链表,使其变成:

头结点->1->2->3->4->5->6->null

思路分析:既然是反过来,那么就从反过来后的第一个元素入手,即null,让第一个结点的next先指向null,类似: 6->null这个结构,继续这个思路,那下一步就是让5指向刚刚这个结构,依次类推,知道最后一个1指向2->3->4->5->6->null

代码:

// 2. 链表反转: 假设有链表6->5->4->3->2->1,反转链表成为1->2->3->4->5->6
function reverse(LineStruct $linelist) {
	// 第一个结点
	$pre = null;
	$leftNodes = $linelist->next;	
	while($leftNodes) {
		① $temp = $leftNodes->next;
		② $leftNodes->next = $pre;
		③ $pre = $leftNodes;
		④ $leftNodes = $temp;
	}
	$headNode = new LineStruct('',$pre);
	return $headNode;
}

先从第一遍开始分析,$leftNodes为6->5->4->3->2->1->null,之所以叫leftNodes,抽象表示剩下的结点,① 我们先用$temp保存6的下一个结点,即5->4->3->2->1->null,② 然后让6指向预先定义的pre,第一个当然是null,这个pre后面会改变。得到的结构是6->null,③ 接着我们用pre来保存这个结构,最后也是最重要的一部步,④将$leftNodes用$temp的值替换,那么下次循环就是从5这个结点开始了,先保存剩下的结点,,即4->3->2->1->null,然后5会先指向刚刚的pre,即6->null,变成5->6->null,这个结构一会再保存为pre,然后再讲$leftNodes置为$temp,直到最后一个$leftNodes = null,跳出循环,这时候的$pre就是1->2->3->4->5->6->null。

所以整个思路里最重要的就是保存当前结点的下一个结点,即保存剩下的结点。

 

数据结构 – 栈的链式存储结构

同单链表类似,每一个节点都有指向下一个节点的指针域,但是不同于单链表的是,栈只能是top(栈顶)位置的元素在变化, 换句话说,栈的插入和删除都是针对固定的位置,不像单链表,只要位置合理,可以是任意的位置。所以栈的操作,不管是顺序结构还是链式结构,相对来说都简单很多。

定义
typedef struct StackStruct{
    ElemType e;
    SSLP next;
}SSL,*SSLP;

typedef struct LinkList{
    SSLP top;  
}
 插入和删除

和顺序栈不同,这里的top不再是游标,可以理解成一个对象。插入只需将新的结点赋值给top,再讲新节点的next指向原来的top

s->next = S->top;
 S->top = s;

删除也类似,将top指向的结点弹出,top的next变成新的top

S->top = S->top->next

栈的链式存储结构-php代码模拟

 

数据结构 – 栈的顺序存储

栈是一种特殊的线性表。栈遵循后入先出的原则,也就是说,栈只允许在栈顶一段对数据进行操作。

栈的顺序存储

同线性表的顺序存储类似,不过有一个游标去控制数据的插入和删除。先看看定义

typedef struct stack{
    elemType e;
    int top;
 }stack;

顺序栈的插入

Status SLinkListPush(SLinkList *s, SElemType e) {
	if(s->top > MAXSIZE - 1) return ERROR
	s->top++;
	s->data[s->top] = e;
	return OK;
}

顺序栈的弹出

Status SLinkListPop(SLinkList *s, SElemType *e) {
	if(s->top == -1) return ERROR;
	*e = s->data[s->top];
	s->top--;     
	return OK;                                                
}

由代码看,时间复杂度都是O(1),因为只能对栈顶操作,所以栈相对于线性表,还是要简单点。

两栈共享空间

因为顺序栈是由数组实现。所以在长度上就有限制,如果长度分配不当就会出现溢出的现象,就得重新分配新的内存空间。如果两个栈公用一段内存空间呢?

即用一个数组去表示两个栈,假如数组长度为n,那么栈1为空时,top1 = -1,栈2为空,top2 = n,当top1 +1 == top2就表示栈满了,即数组的空间已经用完了。

定义

typedef struct stack{
    elemType e;
    int top1; 
    int top2; // 多了一个控制栈2的游标
 }stack;

具体:顺序栈即两栈共享空间-php代码模拟