模拟链表 : 链表中的每一个节点都有一个指针域和数据域 , 要使用数组去模拟链表则需要两个数组去实现 , 一个数组data相当于链表中的数据域存储数据 . 一个数组right相当于指针域存储第一个数组中所要访问元素的下标 , right数组中的存储模式是存放当前序列中每一个元素右边的元素在数组中的位置 ,
如下所示 :
data :
下标 : 1 2 3 4 5 6 7 8 9 10
数据 : 2 3 5 8 9 10 15 42 78
right :
下标 : 1 2 3 4 5 6 7 8 9 10
数据 : 2 3 4 5 6 7 8 9 0
假如要在8的前面插入一个6时 , 只需将6直接放入data的末尾 , 即将data[10] = 6 , 再将right[3]改为10 , 代表新的数据存放在3号元素的右边存放的是data[10]的数据 , 再将right[10] = 4 ; 代表新序列10号元素右边的元素存放到data[4]中 .这样我们通过right数组的下标就可以遍历整个data数组 ,
如下所示 :
data :
下标 : 1 2 3 4 5 6 7 8 9 10
数据 : 2 3 5 8 9 10 15 42 78 6
right :
下标 : 1 2 3 4 5 6 7 8 9 10
数据 : 2 3 10 5 6 7 8 9 0 4
代码如下 :
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
//存放数据
int data[100];
//存放序列中每一个的右边坐标
int right[100];
int n, i, h, len, cur;
printf("请输入链表存储数据的长度!\n");
scanf("%d", &n);
printf("\n请输入要存储的数据\n");
for (i = 1; i < n+1; i++)
scanf("%d", &data[i]);
len = n;
//将right数组初始化,并且在数组的最后增加一个数
for (i = 1; i < n+1; i++)
{
if (i < n)
right[i]=i+1;
else
right[i] = 0;
}
++len;
printf("请输入要增加的元素\n");
scanf("%d", &data[len]);
h = 1;
while (h)
{
//当插入元素在第一个元素之前时,需要特殊处理
if (h == 1 && data[h]>data[len])
{
right[len] = right[h];
right[h] = len;
//将data数组的前两个数据交换
cur = data[h];
data[h] = data[len];
data[len] = cur;
break;
}
else if (data[right[h]] > data[len])
{
right[len] = right[h];
right[h] = len;
break;
}
else
//用right来更新h
h = right[h];
}
printf("data数组中的原始数据存放!\n");
for (i = 1; i < len + 1; i++)
printf("%d ", data[i]);
printf("\nright数组中的数据下标存放!\n");
for (i = 1; i < len + 1; i++)
printf("%d ", right[i]);
h = 1;
printf("\ndata数组中处理后数据存放!\n");
while (h)
{
printf("%d ", data[h]);
h = right[h];
}
printf("\n");
system("pause");
return 0;
}
调试结果如下 :
若有出错或不懂的地方, 欢迎留言, 共同进步 !