顺序表和链表
目录
1.线性表
线性表是n个具有相同特征的数据元素的优先序列。线性表是一种在实际中广泛应用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是连续的一条直线,但是实际在物理结构上不一定是连续的(例如 链表)
2.顺序表
2.1顺序表的概念
顺序表使用一段物理地址连续的存储单元一次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。(说人话———顺序表就是数组)
注意:顺序表和数组还有有点不同的,数组可以有空元素,但是顺序表必须是连续存储的。
在c言阶段我们学过动态内存开辟,那么顺序表也就相应的可以分为
1.静态顺序表:使用定长数组存储元素。
2.动态顺序表:使用动态开辟的数组存储。
这样建立顺序表就可以根据实际情况进行增容
2.2接口实现
对于上面的动态顺序表,我们来试着实现它的如下这些功能:(练习)
注意:为了不必要的麻烦,我们防御性的(在这里表现为形参的合理性--assert(ps))写代码来避免一些后面难于去调试的错误。
1.首先是尾插:
思路:在数组最后添加上要插入的数据(不越界情况下)
在这里我们要注意扩容,否则就会越界
注意:越界时编译器可能会不报错,但这并不代表着我们可以越界,因为编译器报错是站岗抽查式的。(这就好比如酒驾,有可能交警抓不到你,但你绝不可以酒驾)
我们也可以在每次执行完成后destroy一下,这样可以释放空间也能对于越界报错(不一定每次都报错,主要还是在编写时自己注意!)
2.前插:
思路:把所有数据向后挪一位,好让要插入的数据进来。
扩容代码的内容:
3.后删:
思路:直接ps->size-1,根本不需要对最后一个数据进行改动,直接吧最后一个数据“挤下车”
注意:size=0这个情况要考虑,防止越界。
4.前删:
思路:所有数据向前赋值,注意不要访问到ps->a[size](不要越界!)
小总结:
而要怎么使这些缺陷被弥补呢?可以用 链表(新知识,明天学习,今天打牢顺序表)
5.打印和初始化
较易于实现,不做过多赘述
6.查找和修改
较为简单
其中可以注意一下find很灵活的,可以为别的函数找出“pos”
例如:
把这个数组中出现的所有该数删除:
找到一个数并修改成其他数:
6.任意位置的插入和删除
✨任意位置的插入:
思路:吧要插入的位置之后的元素后移,为所要插入元素腾出空间
✨任意位置的删除:
思路: 把要删除的元素的后面的所有元素向前赋值就好
如图中我所述,掌握好了这个就等于掌握了所有插入情况,哈哈(我故意放在后面的)
装饰一下(未完成全部“装饰”):
void menu()//菜单这种东西太弱智了,没必要先写(甚至没必要写,写着玩玩就好),而且在写代码时如果先写了菜单,会导致后面调试的时候特别麻烦
{
printf("*********************************\n");
printf("*******1.尾插 2.头插*********\n");
printf("*******3.查找 4.修改*********\n");
printf("*******5.删除 6.打印*********\n");
printf("*******-1.退出********************\n");
}
int main()
{
SL s1;
SLInit (&s1);
int input = -1;
int x, y;
do
{
menu();
if (scanf("%d", &input) == EOF)
{
printf("输入错误\n");
break;
}
int val, pos;
switch (input)
{
case1:
printf("请输入你要尾插的数据,以0结束:");
scanf("%d", &val);
while (val != 0)
{
SLPushBack(&s1, val);
scanf("%d", &val);
}
break;
case2:
break;
case3:
break;
case4:
printf("请输入你要改变的值和改变后想要得到的值:");
scanf("%d %d", &x, &y);
int pos = SLFind(&s1, x);
if (pos != -1)
{
SLModify(&s1, pos, y);
}
else
printf("没找到:%d\n", x);
break;
case5:
break;
case6:
SLPrint(&s1);
break;
default:
printf("输入错误请重新输入");
break;
}
} while (input != -1);
SLDestroy(&s1);
//TestSeqList1();//测试初始化功能
//TestSeqList2();//测试后插功能
//TestSeqList3();//测试前插功能
//TestSeqList4();//测试后删功能
//TestSeqList5();//组合运用SLFind 和别的函数
//TestSeqList();//把顺序表里面所有的一个数全删了
return 0;
}
总结:顺序表很考验C语言基本功,今日感觉基础再次巩固了一点点,可惜一日只有24小时
目录
总结:顺序表很考验C语言基本功,今日感觉基础再次巩固了一点点,可惜一日只有24小时,链表明天学吧