10. (1)
11.(2)
12. (3)
三、算法设计题
1. 建立一个有n个结点的单链表,要求从尾部进行插入。
分析:本题的算法思想是设置指针变量q始终指向当前链表中的最后一个结点,新生成的结点直接在
尾部进行插入。这种设置指针变量q的方法使得操作比较简单,否则每次在尾部插入新结点时需要用一个
临时指针变量从链表头部移到链表尾部。
void createlklistfromtail (lklist *&head )
{
int i; lklist *p,*q;
for (i=1,head=0;i<=n;i++)
{
p=(lklist *)malloc(sizeof(lklist)); scanf("%d",&(p->data));p->next=0;
if(i==1)head=q=p;else {q->next=p;q=p;}
}
}
提示:以下形式参数表中出现在形式参数名前加符号“&”的现象,这种现象在我们常见的Turbo C
2.0版本中不能使用,但在及其以后版本中可以使用,它的作用是使得对形式参数的修改可以影响到对应
的实在参数。以后算法设计题中经常用到。
2. 建立一个有n个结点的单链表,要求从头部进行插入。
void createlklistfromhead (lklist *&head )
{
int i; lklist *p,*q;
for (i=1,q=head=0;i<=n;i++)
{
p=(lklist *)malloc(sizeof(lklist));
scanf("%d",&(p->data)); p->next=head; head=p;
}
}
提示:不断从头部插入新结点的方法来构造单向链表比不断从尾部插入新结点的方法来构造单向链
表稍微操作简单一些。但顺序打印从尾部插入建立的单向链表所得到的序列与建立单向链表输入的序列
一样,而顺序打印从头部插入建立的单向链表所得到的序列与建立单向链表输入的序列正好相反。
3. 用顺序存储结构实现线性表就地逆置算法,即在原表的存储空间内将线性表(a
1
,a
2
,……,a
n
)逆
置为(a
n
,a
n-1
,……,a
1
)。
void invertsqlist(sqlist &list)
{
int i,temp,n=list.n;
for(i=1;i<=n/2;i++){temp=list.a[i-1]; list.a[i-1]=list.a[n-i]; list.a[n-i]=temp;}
}
提示:本题中的循环次数只能是顺序线性表的长度一半,如果循环次数是顺序线性表的长度,则经
过逆置后再逆置而还原到初始状态。
4. 用链式存储结构实现线性表就地逆置算法,即在原表的存储空间内将线性表(a
1
,a
2
,……,a
n
)逆
置为(a
n
,a
n-1
,……,a
1
)。
分析:本题的算法思想是依次将单链表中的结点取出来并用指针q指向它,然后再用从头部插入的方
法建立一个新的单链表。
void invertlklist(lklist *&head)