1、对单链表结构和顺序存储结构做对比
---- 1)存储分配方式
-- 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素。
-- 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。
---- 2)时间性能
-- 查找:顺序存储结构O(1),单链表O(n)
-- 插入和删除:
顺序存储结构需要平均移动表长一半的元素,时间为O(n)。单链表在找出某位置的指针后,插入和删除时间仅为O(1)。
---- 3)空间性能
-- 顺序存储结构需要预分配存储空间,分大了,浪费,分小了易发生上溢。
-- 单链表不需要预分配存储空间,只要有就可以分配,元素个数也不受限制。
从空间限制来看,顺序表在静态存储分配的情形下,一旦存储空间装满不能扩充,如果再加入新元素将出现存储溢出;在动态存储分配的
情形下虽然存储可以扩充,但需要移动大量元素,将导致操作效率降低。
线性链表的结点空间只有在需要的时候才申请,无需事先分配,因此只要还有空间可分配,就没有存储溢出问题,操作效率也优于顺序表。
---- 4)访问方式
-- 顺序表可以顺序存取,也可以直接存取。
-- 线性链表只能从链头顺序存取。
---- 5)逻辑顺序与物理位置的关系
-- 顺序表中表元素的逻辑顺序与它们的物理存储顺序是完全相同的。
-- 线性链表中各个表元素的逻辑顺序与物理存储顺序不一定相同。
---- 6)查找速度
-- 由于线性链表只能沿链逐个比较,而顺序表可以按照元素序号(下标)直接访问,故顺序表查找速度比线性链表要快。
-- 从插入和删除速度来看,如果要求插入和删除后表中其他元素的相对逻辑顺序保持不变,则顺序表平均需要移动大约一半元素,
而线性链表只需修改链接指针,不需要移动元素,因此线性链表比顺序表的插入和删除速度快。
---- 7)C指针的使用
-- 顺序表的情形下,指针p指示数据元素存储位置,用*p可取得该数据元素的值,用p++可以顺序进到物理上下一个数据元素的位置;
-- 在线性链表的情形下,指针p指示链表结点的地址,用*p不能取得该结点数据的值,用p++也不能进到下一个结点的位置,只能使用
p->data取得结点数据的值,用p=p->next进到下一个结点。
2、结论
---- 通过上面的对比,我们可以得出下列结论:
--- 1)若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。
若需要频繁插入和删除时,宜采用单链表结构。
--- 2)当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。
如果事先知道线性表的大致长度,用顺序存储结构效率会高很多。
3、静态链表
---- 用数组描述的链表叫做静态链表,也叫游标实现法。
数组的元素都是由两个数据域组成,data和cur。即数组的每个下标都对应一个data和一个cur。数据域data,用来存放数据元素,是我们
要处理的数据;游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。
4、已知带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的DelNode函数。
typedef struct node
{
int data;
struct node *next;
} Node;
//删除结点的数据域值为x的结点
void DelNode(Node *head,int x)
{
Node *p,*q,*s;
p = head;
q = p->next;
while(q!=head)
{
if(q->data==x)
{
p->next=q->next;
s=q;
q=q->next;
free(s);
}
else //不相等,向后移动
{
p=q;
q=q->next;
}
}
}
5、某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。
现出库(销售)m台价格为h的电视机,试编写算法修改原链表。
typedef struct node
{
float price; //价格
int num; //数量
struct node *next;
} Node;
//销售m台价格为h的电视机
void DelNode(Node * head,float h,int m)
{
Node *p,*q,*s;
p = head;
q = p->next;
int i=0;
while(q->price<h&&q!=head)//价格小于h,循环到价格等于h
{
p = q;
q = q->next;
}
if(q->price==h&&q->num>=m)
{
q->num=q->num-m;
if(p->num==0)
{
p->next=q->next;
free(q);
}
}
else if(q->price==h&&q->num<m)
{
cout<<"此价格的产品不足%d台。"<<m<<endl;
}
else
{
cout<<"无此产品。"<<endl;
}
}