开始学习数据结构,刚开始学没有一个整体的概念,学一点写一点吧!
第一次更新
链表之顺序表
首先我们应该定义一个顺序表
如果顺序表的元素只是数字的话,未免太单调了一些!
所以,先定义一个数据类型来吧!!!
typedef struct
{
int id;
char *name;//字符型指针,如果不太明白,请自行百度
} ElementType;
于是我们得到了一个叫做ElementTtype的的数据类型,接下来开始定义顺序表
typedef struct
{
ElementType data[MAX_SIZE];
int length;//为了以后便于操作,我们加入一个length
}SeqList;
我们得到了一个顺序表,接下来我们写一些方法来对这个顺序表进行操作
最基础的操作应该是插入操作,而不是初始化操作。
对整个链表进行统一的相同的操作叫做初始化。嗯,应该是这样的!
先上代码,再解释
插入算法
void InsertElement(SeqList *seqlist, int index, ElementType element)
{
if (seqlist->length + 1 >= MAX_SIZE)
{
printf("inster fail ,plese try again");
}
else if(index<0||index>MAX_SIZE-1)
{
printf("the index is unavailble!");
}
else
{
ElementType tem;//临时变量
for ( int i = seqlist->length; i >= index;i--)
{
seqlist->data[i + 1] = seqlist->data[i];
}
seqlist->data[index] = element;
seqlist->length++;
}
}
我们如何写一个方法?
从以下几个角度考虑
我们需要传入什么?
我们要对链表进行操作,当然需要传入待插入操作的链表,我们需要插入元素,当然需要传入一个与链表数据类型相同的数据元素,此外这个链表很长,我们不知道向那个位置插入,这时候就需要传入对应操作的位置(这就是索引)
我们返回什么?
对于返回值来说,我们的操作的结果是改变这个链表,当然可以返回这个插入后的链表,但是我们从各个方面综合考虑来看,使用指针直接对原数据经行操作会更好
那么我们如何利用传入得到传出?
1.我们应该对传入的索引进行验证,以免发生越界的情况
索引是从0开始的,传入的索引不能超过链表的最大长度MAX_SIZE,于是index<MAX_SIZE-1,那么index肯定要>0
2.对链表的长度也是需要验证的
链表的长度不能超过链表的最大长度的
链表的长度也不能等于链表的最大长度
3.如果上述的验证都通过那么,我们可以大胆放心的进行插入操作了
所谓插入操作不过是对数据元素进行重新排序而以
我们知道进行完插入操作之后,链表的长度肯定是要加1的
现在有两个思路
第一个是,我们先把我么需要插入的元素放到索引在的位置上,然后把该位置的元素以此后移一个单位
第二个是,我们从后向前来,把最后一个元素后移一个单位,然后依次进行,那么到索引在的位置的时候,我们直接经行插入
这样的话我们的插入方法应该就算是写完了
接下来是初始化算法
初始化算法
void InitList(SeqList *seqlist, ElementType * element, int length)
{
if (length >= MAX_SIZE)
{
printf("the length more lenth than maxsize");
}
else
{
seqlist->length = 0;
for ( int i = 0; i < length; i++)
{
InsertElement(seqlist, i, element[i]);
}
}
}
对于传入的元素依次进行插入算法就ok了,不过注意传入数据的长度和MAX_SIZE的关系
具体的思路参考上面的插入算法