作业地址
1 ( 35分 )
请完成下列算法填空实现对顺序表逆置存储,逆置存储是指将元素线性关系逆置后的顺序存储,例如(a0,a1,a2),关系逆置后为(a2,a1,a0).
SeqList的结构体定义如下:
typedef struct seqList
{
int n;
int maxLength;
ElemType *element;
}SeqList;
void Invert(SeqList *L) {
ElemType temp; int i;
for ( i=0; i<________; i++) {
temp =____________;
L->element[i] = L->element[___________];
L->element[________] = ___________; }
}
注意:程序题语法错误不扣分,为了避免程序题在互评时因为语法错误被误伤,请尽量写清楚注释,或简单描述一下算法思想。
参考答案:
`void Invert(SeqList *L)
{
ElemType temp;
int i;
for(i = 0;i<(L->n)/2;i++) //当前数组的实际长度时n,故进行n/2次循环即可,切记不可缺省“/2”
{
temp = L->element[i];
L->element[i] = L->element[n-1-i];
L->element[n-1-i] = temp;
}
}`
2、请完成下列算法填空现对单链表的逆置存储,逆置存储是指将元素线性关系逆置后的链表存储,例如(a0,a1,a2),关系逆置后为(a2,a1,a0).
单链表结点Node和单链表SingleList结构体定义如下:
typedef struct node
{
ElemType element;
struct node *link;
}Node;
typedef struct singlelist
{
Node *first;
int n;
}SingleList;
void invert(SingleList *L) {
Node *p=__________,*q;
L->first=NULL;
while (_____) {
q=p->link;
p->link=_______;
L->first=_______;
p=_______; }
}
参考答案
void invert(SingleList *L)
{
Node *p = L->first ,*q; //使p指向首节点
L->first = NULL;
while(p != NULL) //判断p是否指向尾节点
{
q = p->link; //q指向p的下一个节点
p->link = L->first ;
L->first = p;
p = q;
}
}
此题是利用两个新建指针,从后往起一个一个改变节点指向。最终的运行结果是 L->first指向尾节点、p = q = NULL
3、完成下列算法填空,将两个有序递增的带表头结点的单链表合并为一个有序递增的单链表。
链表结点Node和链表SingleList结构体定义如下:
typedef struct node
{
ElemType element;
struct node *link;
}Node;
typedef struct headerlist
{
Node *head;
int n;
}HeaderList;
void MergeList1(HeaderList *La,HeaderList *Lb,HeaderList *Lc) {
//合并链表La和Lb,合并后的新表使用头指针Lc指向
Node *pa,*pb,*pc,*q;
pa=La->head->link;
pb=Lb->head->link;
pc=Lc->head;
while(pa && pb) {
if(____________________) {
pc->link=pa;
pc=pa;
pa=pa->link;
La->n--; }
else if(pa->element>pb->element) {
pc->link=___________;
pc=________;
pb=_________;
Lb->n--; }
else {
pc->link=pa;
pc=pa;
pa=_________;
q=_________;
free(pb);
pb =q; }
Lc->n++; }
pc->link=pa?pa:pb; //插入剩余段 Lc->n+=pa?La->n:Lb->n;
}
参考答案:
while(pa&&pb) //判断两个指针谁先到达各自链表的末尾
{ /*分三种情况,看pa、pb当前所指向的节点中的值大小*/
if(pa->element < pb->element) /*当pa所指向的节点中的值
{
pc->link = pa; //Lc链表中的指针pc的指针域指向pa所指向的节点
pc = pa; //Lc链表中的指针pc指向pa的节点位置,为下次循环做好准备
pa = pa->link; //pa移到La链表的下一个节点
La->n--; //La的链表长度减一
}
else if(pa->element > pb->element) /*当pa所指向的节点中的值>pb所指向的节点中的值时*/
{
pc->link = pb; //Lc链表中的指针pc的指针域指向pb所指向的节点
pc = pb; //Lc链表中的指针pc指向pa所指向的节点位置,为下次循环做好准备
pb = pb->link; //pb移到Lb链表的下一个节点
Lb->n--; //Lb的链表长度减一
}
else /*当pa所指向的节点中的值=pb所指向的节点中的值时*/
{
pc->link = pa; //Lc链表中的指针pc的指针域指向pa所指向的节点
pc = pa; //Lc链表中的指针pc指向pa的节点位置,为下次循环做好准备
pa = pa->link; //pa移到La链表的下一个节点
q = pb->link; //定义一个新的指针存储pb在Lb的下一个节点
free(pb); //释放掉当前pb的动态内存
pb = q;
}
Lc->n++; //每次循环结束之前Lc的长度加一
}
此题注释比较详细,自己也刚刚起步学习,对数据结构的专业术语表达也有限,所以这里如果能给你一丢丢帮助的话我也会很开心哟,有什么问题或者改善的地方可以私信我,谢谢。