1.什么是数组模拟链表:
数组模拟链表是一个什么呢?就是在某索引处存储下一个索引。下面举例说明:
不知道大家明白了没有。如果我上面的数组定义为a[4],那么我访问a[0]时,所获取的就是下一个位置所对应的索引。也就是我要向访问a[0]的下一个节点,那么我只需要访问a[a[0]],这样,就获取了下一个节点处的值。
2.链表的操作:
2.1增
把0、3用frist、last进行存储的话,这样的话,在对数组进行操作以后,增加操作我个人感觉也就可以执行了。此时first=0,last=3。
i. 需要new一个比原数组大1的数组,然后进行数组clone。
ii. 需要修改索引为last的值为数组.length-1(此时为4)
iii. 把新增加的索引处的值改为first(此时为0)
iv. 修改last的值为数组.length-1
2.2 删
举例:删除索引为1的值所对应的元素(其实不是删除,这个我感觉很不好)。
i. 获取索引1处的值:2
ii. 获取索引2处的值:3
iii. 讲1处的值改为2处的值
iv. 如果删除的为last处的值,需要将last改为值为last处的索引,例如删除4,那么last需要改为值为4处的索引:3.
v. 如果删除的为first处的值,那么将first改为索引first处的值,例如删除0,那么first需要改为索引0处的值:1
这样,就没有了指向2处的元素,这个元素也就被“删”掉了。
2.3 其他操作
其他操作需要很强的依赖数组操作,有兴趣可以自己研究一下,由于这次我做的例子用到的不多,我也就不再一一列举了。
3 C语言结构体数组实现链表
#include<stdio.h>
#include<stdlib.h>
#define K 4
void main(){
struct array{
int data;
int index;
};
struct array arr[10]={{'a',1},{'b',2},{'c',3},{'d',4},{'e',5},{'f',6},{'g',7},{'h',8},{0,0},{0,0}};
int pos=0;
//K=5;
arr[sizeof(arr)-1].data='k';
arr[K].index=sizeof(arr)-1;
arr[sizeof(arr)-1].index=K+1;
while(arr[pos].data != 0){
printf("%c",arr[pos].data);
pos=arr[pos].index;
printf("\n");
}
}
简单实现便于理解数组的操作过程。