bar

#/bin/bash
PATH=${PATH}:~/bin
export PATH

预览
eat[1]="卖当当漢堡包"       # 写下你所收集到的店家!
eat[2]="肯爷爷炸鸡"
eat[3]="彩虹日式便当"
eat[4]="越油越好吃大雅"
eat[5]="想不出吃啥学餐"
eat[6]="太师父便当"
eat[7]="池上便当"
eat[8]="怀念火车便当"
eat[9]="一起吃方便面"

index=0
while [ 1 ]
do

check=$((${RANDOM}*9/32767 +1))

if [ ${#picked[@]} ==  0 ]; then
picked[${index}]=${check}
continue
fi

for ((i=0;i<${#picked[@]};i++))
do
   if [ ${check} == ${picked[${i}]} ]; then
      continue 2
   fi
done

((index++))
picked[${index}]=${check}

if [ ${index} == 2  ]; then
break
fi

done

for pick in $(echo ${picked[*]})
do
echo ${eat[${pick}]}
done

 

线性表 – 静态链表

有的开发语言并没有指针一说,那么就无法实现单链表,于是有人提出可以用数组的形式去描述单链表,称之为静态链表

同单链表的节点类似,数组的每一个元素都保存了两个值,数据和游标,游标类似于指针,其值是后继元素的下标。

静态链表的下标并不像普通数组那样代表顺序,而是每一个元素的cursor代表着顺序,比如要找到第二个元素,并不是下标为2的元素,而是第一个元素的cursor,这个cursor代表着第二个元素的下标值。

既然是数组,那么在分配内存的时候,内存大小是会大于数组大小的,为了防止数组的溢出,所以在静态链表中,有备用链表这么一说,没有保存数据的元素就是备用链表的一员。

同单链表一样,静态链表的第一个和最后一个元素也有着特殊意义,第一个元素的cursor指向的是备用链表的第一个元素的下标值,最后一个元素的cursor指向的是第一个有值的元素的下标。

单链表的定义
typedef struct StaticLinkList{
    ElemType e;
    int cur;
}StaticLinkList

单链表的插入

插入之前,要先做一件事,这个新插入的元素我们把它放在备用链表的第一个元素上,然后链表第一个元素的cursor指向后一个元素下标

int molloc_lls(StaticLinkList L) {
    k = L[0].cursor;
    if(k) {
         L[0].cursor = L[k].cursor;
         return k;
    }
    return 0;
}

下面实现插入的逻辑:

Status listInsert(StaticLinkList L, int i, ElemType e) {
    // 先找到i之前那个元素的下标, k指向第i个之前元素的下标
    k = MAXSIZE - 1;
    for(int j = 0;j < i -1;j++) {
         k = L[k].cursor;
    }
    // i之后元素的下标值
    next = L[k].cursor;
    m = mollac_lls(L);
    L[m].data = e;
    L[m].cursor = next;
    L[k].cursor = m;
    return Ok 
}

静态链表的php模拟

 

数据结构 – 线性表

线性表是一种常见的数据结构,逻辑结构的层面上,它代表着一串前后相连,有顺序的数据,在物理结构上,它又有多种表现形式,比如常见的数组就是线性表的顺序存储结构。

线性表的链式存储结构:

链式存储结构中,每一个元素被称作一个节点,节点分成两部分,分别为数据域和指针域,数据域保存着节点的数据,指针域保存着下一个节点对应的地址。换句话就是,知道一个节点的地址,后面所有节点的地址都能获取到。像这种一个节点保存一个指针的称作为单链表,单链表中,一般有一个头结点,头结点的指针域保存着第一个节点的地址,最后一个节点的指针域则为null。单链表的定义如下:

#define MAZSIZE 20
 typedef int ElemType;
 typedef struct Node{
    ElemType data[MAXSIZE];
    Node *next;
 }Node,*LinkList;
单链表的插入: 

单链表的插入过程相对于顺序存储结构简单了很多,比如在i位置插入一个元素,只需要在内存中随机分配一块保存新节点的数据,然后将i前一个元素的指针指向新分配的地址,再将新节点的指针域指向第i个元素的地址

 $new->next = $p->next;
  $p->next = $new;
 代码实现:
// 单链表的插入
/*
 * 1. 声明一点p代表链表的第一个节点,开始遍历,累加初始遍历j
 * 2. 如果到链表的结尾,还没有累加到i,则说明i位置不存在
 * 3. 找到i位置,新建节点s,s->data=e;
 * 4. 前后节点的地址变化
 */
Status ListInsert(LinkList L, int i ,Elem e) {
	L = LinkList->next;
	j = 1;
	while(L && j < i) {
		L = L->next;
		j++;
	}
	if(!L || j > i) 
		return ERROR;
	LinkList s;
	s = (LinkList) malloc (sizeof( Node ));
	s->data = e;
	s->next = L->next;
	L->next = s;
	return OK;
}


// 单链表的删除
/*
 * 1. 声明一点p代表链表的第一个节点,开始遍历,累加初始遍历j
 * 2. 如果到链表的结尾,还没有累加到i,则说明i位置不存在
 * 3. 找到i位置,前后节点的地址变化
 */
 Status NodeDelete(LinkList L, int i ,Elem *e) {
 int j = 1;
 L = L->next;
 while (L && j < (i-1)) {
 L = L->next;
 j++;
 }
 if(!L || ++j > i) 
 return ERROR;
 q = L->next;
 p = q->next;
 L->next = p;
 *e = q->data;
 free(q);
 return OK;
 }

PHP代码模拟单链表

HTML5 – 文件上传

利用XMLHttpRequest快速实现无刷新上传文件。

利用FormData这个对象可以方便的使用表单内的数据,它有以下几个主要函数:

append : 想表单数据中追加某些数据

var fm = new FormData();
 fm.append('name', 'laokiea');

set  :  通过name值设置第一个对象的value值,如果不存在则新增一个

fm.append('name', 'laokiea');
 fm.set('name', 'bob');

 get  :  通过name值获取第一个对象的value值

fm.get('name')

我们使用该对象来上传图片:

var fileInput = document.getElementById("upload");
var formData = new FormData();
var xhr = new XMLHttpRequest();
var submit = document.getElementById("submit");

var file = fileInput.files;

for(var i = 0;i < files.length; i++) {
var file = files[i];
fm.append('files[]', file, file.name);
}

xhr.open('POST', 'upload.php', true);
xhr.send(fm);
xhr = null;

显示进度条,XMLHttpRequest有个upload属性,该属性有对应的onprogress方法,方法的事件对象有两个属性,分别是loaded和total,代表已上传的字节数和总字节数。用这两个值可以计算出进度。

// 显示进度
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
var percentComplete = (event.loaded / event.total) * 100;
progress.value = percentComplete;
}
}

图片预览,可以使用FileReader对象,该对象有 readDataAsURL方法,可以将文件资源转换成以data:打头的URL资源。这里需要把reader对象放在循环里去实例化。

                         function preview() {
				var files = fileInput.files;
				for (var i = 0;i < files.length;i++) {
					var file = files[i];
					if(file.type != '' && /image\/\w+/.test(file.type)) {
						var reader = new FileReader();
						// 图片预览
						reader.onload = function(event) {
							var image = new Image();
							image.width = 100;
							image.src = this.result;
							document.body.appendChild(image);
						};
						reader.readAsDataURL(file);
					}
				}
			}

拖拽上传,主要实现ondragenter, ondragover, drop三个方法,分别表示,拖拽进来, 拖来拖去, 拖拽后,但是因为浏览器会自动打开拖拽的文件,所以要组织默认事件。

// 拖拽上传
			var holder = document.getElementById('holder');
			holder.ondragenter = function(e) {
				e.stopPropagation();
				e.preventDefault();
			}
			holder.ondragover = function(e) {
				e.stopPropagation();
				e.preventDefault();
			}
			holder.ondrop = function(e) {
				e.stopPropagation();
				e.preventDefault();
				window.files = e.dataTransfer.files;
				preview();
			}

 

总的代码:

<html charset='utf-8'>
<head>
	<title>upload</title>
	<style type="text/css">
		html,body{width:100%;}
		#holder {
			border: 10px dashed #000;
			width:  300px;
			height: 300px;
			min-height: 300px;
			margin: 20px auto;
		}
		#holder.hover {
			border: 10px dashed #0c0;
		}
	</style>
</head>
<body>
		<input type='file' id='upload' onchange='preview()' multiple/>
		<input type='submit' id='submit' value='ok'/>
		<progress id='progress' value=0 max=100></progress>
		<div id="holder"></div>
		<script>
			var fileInput = document.getElementById("upload");
			var formData = new FormData();
			var xhr = new XMLHttpRequest();
			var submit = document.getElementById("submit");
			var progress = document.getElementById("progress");

			function preview() {
				var files = fileInput.files;
				for (var i = 0;i < files.length;i++) {
					var file = files[i];
					if(file.type != '' && /image\/\w+/.test(file.type)) {
						var reader = new FileReader();
						// 图片预览
						reader.onload = function(event) {
							var image = new Image();
							image.width = 100;
							image.src = this.result;
							document.body.appendChild(image);
						};
						reader.readAsDataURL(file);
					}
				}
			}

			// 拖拽上传
			var holder = document.getElementById('holder');
			holder.ondragenter = function(e) {
				e.stopPropagation();
				e.preventDefault();
			}
			holder.ondragover = function(e) {
				e.stopPropagation();
				e.preventDefault();
			}
			holder.ondrop = function(e) {
				e.stopPropagation();
				e.preventDefault();
				window.files = e.dataTransfer.files;
				preview();
			}

			submit.onclick = function() {
				files = fileInput.files;
				for (var i = 0;i < files.length;i++) {
					var file = files[i];
					formData.append('files[]',file, file.name);
				}
				// xhr.onreadystatechange = function(){
				// 	console.log(this.readyState);
				// }

				xhr.open("POST","upload.php",true);

				//xhr.onload = function() {
				// if(this.status == 200) {
				// 		alert(this.response);
				// 	}
				// }

				// 显示进度
				xhr.upload.onprogress = function(event) {
					if (event.lengthComputable) {
        				var percentComplete = (event.loaded / event.total) * 100;
        				progress.value = percentComplete;
    				}
				}

				xhr.send(formData);
				xhr = null;
			}

		</script>
</body>
</html>

参考文章:

https://segmentfault.com/a/1190000006716454

http://www.helloweba.com/view-blog-192.html

https://www.qcloud.com/community/article/985614?fromSource=gwzcw.114038.114038.114038

http://www.ruanyifeng.com/blog/2012/08/file_upload.html