学校数据结构实验_线性表:纯C语言版

Posted on 2023-05-10 21:39  玄灵镜  阅读(21)  评论(0编辑  收藏  举报

首先分别声明链表和顺序表的结构单位,

 

 

1:插入实现:顺序表插入比较简单,直接访问下表找到插入位置,然后移动所有后面的数据将插入的位置空出来,然后将需要插入的数据插入,

链表的插入:因为一般链表都是调用头插或者尾插,但是为了和顺序表相比较,再插入的时候增加了随机位置插入,所以在插入函数里设计了一个计数器,来辅助记录节点位置,

无论是顺序表还是链表插入的时候呀都要考虑扩容,所以在插入之前增加了扩容代码部分.

 

 这里在链表插入时定位目标位置那里的while函数有点难读,可以设计一个设计一个prev节点记录tail迭代后的前驱值方便一点.

删除函数:链表的删除函数需要一个prev记录前驱,防止删除后找不到上一个接点,影响链表的链接.这里用第一个结点的迭代找到要删除的位置..

顺序表的删除使用下标直接找到要删除的位置,然后向前挪数据填补删除后的空缺.

 

 以上是测试链表与顺序表随即插入的只要需要的函数接口:

接下来设计循环与时间函数测定两个表在大量插入和删除时所用的时间.

for循环中不仅在插入的同时也随机生成了不同整数,再用这些整数对表长取余使其插入不要越界

 

 测试结果却得到了出乎意料的结果(前面的一万次是printf函数中的固定值实际为20000次).

分析:链表的随机插入时间复杂度与顺序表是一样的,顺序表中间插入一个数时间复杂度主要用在移动数据上,而链表随机插入一个数时间复杂度用在迭代上,他们语句几乎在插入位置随机是差不多,但是为什么线性表要比链表在理论上慢呢,查了资料发现线性表的移动数据和链表的迭代在计算机处理上前者比后者慢,所以链表较快一点,但是实验结果却不是这样

差异分析:1:可能是while循环不容易度导致这个环节在每次迭代时拖慢了速度<但是删除却没有这样的问题,

2:可能是链表本身的问题:实验所用链表是一个不带哨兵位节点的链表,可能是每次在传参二级指针上出的问题.........

Copyright © 2024 玄灵镜
Powered by .NET 8.0 on Kubernetes