计算机内部线性表存储方式:
1、顺序存储:顺序表
2、链式存储:链表
顺序表示是指:
用一组地址连续的存储单元依次存储线性表的数据元素;
过程分析:
假设线性表的每个数据元素需要占用x个存储单元,并以所占的第一个单元的存储地址作为数据元素起始的存储位置,因为使用一组连续的存储单元,所以下一个数据元素的位置就是当前首地址向后偏移x个单元即可,所以可以这样表示
存储位置LOC(ai+1) = LOC(ai) + x;
所以也就意味着如果我们要操作第6个元素,而一个数据元素的长度为x,所以我们所要找的第六个元素的地址就是起始位置向后偏移L = (6-1)* x;
相关操作代码实现:
1、保存数据结构的定义:
struct Data()
{
int nums; //数据里面的元素组成(可以定成好多个);
};
struct list()
{
Data ListData[顺序表的最大长度+1]; // 保存顺序表的数组;
int ListLen;//顺序表已存节点数;
};
list *lis = new list();
2、初始化顺序表:
void InitList(list *l)
{
l->ListLen = 0;
}
3、顺序表长度
int LenList(list *l)
{
return l->ListLen;
}
4、添加节点
int AddCode(list *l, Data data)
{
if (l->ListLen >= Max)
return 0;
else
l->ListData[++l->ListLen] = data;
return 1;
}
5、插入节点
int Insert(list *l, int n, Data data)
{
if (l->ListLen >= Max)
return 0;
if (n < 1 || n > l->ListLen-1)
return 0;
for (int i(l->ListLen); i >= n; --i)
l->ListData[i+1] = l->ListData[i];
l->ListData[n] = data;
l->ListLen++;
return 0;
}
6、删除节点
int Delete(list *l, int n)
{
if (n < 1 || n > l->ListLen+1)
return 0;
for (int i(n); i < l->ListLen; ++i)
l->ListData[i] = l->ListData[i+1];
l->ListLen--;
return 0;
}
7、通过序号查找
Data *FindByNum(list *l, int n)
{
if (n < 1 || n > l->ListLen+1)
return 0;
return &(l->ListData[n]);
}
8、通过关键字查找
Data *FindByKey(list *l, char *key)
{
for (int i(0); i <= l->ListLen; ++i)
if (Strcmp(l->ListData[i].key, key) == 0)
return i;
return 0;
}
8、输出顺序表
void Show(list *l)
{
for (int i(0); i <= l->ListLen; ++i)
printf("%d\n", l->ListData[i].nums);
return;
}