南京邮电大学Mooc—第二章_数据结构作业

单链表、C逆序、C两个递增的链表合并成一个递增的链表

作业地址
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
假设链表本身有5个有效数组

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所指向的节点中的值<pb所指向的节点中的值时*/
    {
        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的长度加一
}

此题注释比较详细,自己也刚刚起步学习,对数据结构的专业术语表达也有限,所以这里如果能给你一丢丢帮助的话我也会很开心哟,有什么问题或者改善的地方可以私信我,谢谢。

  • 41
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ocodotial

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值