模拟链表

上一节讲解了单链表的链式存储规则,本节讲解如何模拟链式存储的。

规则:开两个数组,一个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 }
原文地址:https://www.cnblogs.com/guohaoblog/p/9242099.html