1.顺序存储结构不足的解决办法
所有的元素都不要考虑相邻位置,哪有空位就到哪里,而只是让每个元素知道它下一个元素的位 置在哪里,这样,我们可以在第一个元素时,就知道第二个元素的位置(内存地址), 而找到它;在第二个元素时,再找到第三个元素的位置(内存地址)。这样所有的元素 我们就都可以通过遍历而找到。
2.线性表的链式存储结构的特点是什么?
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置
3.:头指针与头结点的异同是什么?
头指针:头指针是指链表指向第一个结点的指针,若链表有头结点, 则是指向头结点的指针
头指针具有标识作用,所以常用头指针冠以链表的名字
无论链表是否为空,头指针均不为空。头指针是链表的必要元素
头结点:头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度)
有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其它结点的操作就统一了
头结点不一定是链表必须要素
4.:获得链表第i个数据的算法思路
声明一个结点p指向链表第一个结点,初始化j从1开始;
当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
若到链表末尾p为空,则说明第i个元素不存在;
否则查找成功,返回结点p的数据。
5.:单链表第i个数据插入结点的算法思路
声明一结点P指向链表第一个结点,初始化j从1开始;
当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
若到链表末尾p为空,则说明第i个元素不存在;
否则査找成功,在系统中生成一个空结点s;
将数据元素e賦值给s->data;
单链表的插入标准语句s->next=p->next; p->next=s;
返回成功。
6.:单链表第i个数据删除结点的算法思路
声明一结点P指向链表第一个结点,初始化j从1开始;
当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加 1;
若到链表末尾p为空,则说明第i个元素不存在;
否则查找成功,将欲删除的结点p->next賦值给q;
单链表的删除标准语句p->next=q->next;
将q结点中的数据赋值给e,作为返回;
释放q结点;
返回成功。
7.:单链表整表创建的算法思路
声明一结点P和计数器变量i;
初始化一空链表L;
让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
循环:
生成一新结点賦值给P;
随机生成一数字賦值给P的数据域p->data;
将p插入到头结点与前一新结点之间。
8.:单链表整表删除的算法思路
声明一结点p和q;
将第一个结点賦值给p;
循环:
将下一结点賦值给q;
释放p;
将q賦值给p。
9.:在循环体内直接写free (p) ;p=p->next;会带来什么问题?
要知道P是一个结点,它除了有数据域,还有指针域。你在做free (p);时,其实是在对它整个结点进行删除和内存释放的工作。
10.:简单地对单链表结构和顺序存储结构做对比
存储分配方式:顺序存储结构用一段连续的存储单元依次存储线性表的数据元素
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素
时间性能:
查找:
顺序存储结构0(1)
单链表0(n)
插入和删除:
顺序存储结构需要平均移动表长一半的元素,时间为0(n)
单链表在线出某位置的指针后,插入和删除时间仅为0(1)
空间性能:顺序存储结构需要预分配存储空间,分大了,浪费,分小了易发生上溢
单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制