上一节讲解了单链表的链式存储规则,本节讲解如何模拟链式存储的。
规则:开两个数组,一个data[N] 另一个right[N]。data数组用来存储数据,right数组用来表示当前序列中每个元素右边元素在datat数组中的位置。
例如:
上图的两个数组中,第一个整型数组data 是用来存放序列中具体数字的,另外一个整型数组right 是用来存放当前序列中每一个元素右边的元素在数组data 中位置的。例如right[1]的值为2,就表示当前序列中1 号元素右边的元素存放在data[2]中;如果是0,例如right[9]的值为0,就表示当前序列中9 号元素的右边没有元素。 最后遍历数据data[right[i]] 即可删除!
具体代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 101 4 5 int main() 6 { 7 int data[N],right[N]; 8 int i,n,t,len; 9 //读入已有的数据 10 scanf("%d",&n); 11 for(i=1;i<=n;i++) 12 scanf("%d",&data[i]); 13 len=n; 14 //初始化数组right 15 for(i=1;i<=n;i++) 16 { 17 if(i!=n) 18 right[i]=i+1; 19 else 20 right[i]=0; 21 } 22 //直接在数组data的末尾增加一个数 23 len++; 24 scanf("%d",&data[len]); 25 //从链表的头部开始遍历 26 t=1; 27 while(t!=0) 28 { 29 if(data[right[t]]>data[len]) //找到要插入的节点的位置 30 { 31 right[len]=right[t]; //新插入节点的下一个节点即为当前节点的下一个节点 32 right[t]=len; //当前节点的下一个节点为新插入节点 33 break; 34 } 35 t=right[t]; //构成循环,相当于链表中的p=p->next 36 } 37 //输出链表中的所有的数 38 t=1; 39 while(t!=0) 40 { 41 printf("%d ",data[t]); 42 t=right[t]; // 相当于链表中的p=p->next 43 } 44 printf(" "); 45 return 0; 46 }