首页 > 其他分享 >数据结构—第二章线性表习题

数据结构—第二章线性表习题

时间:2022-10-29 20:58:01浏览次数:62  
标签:结点 Lb 线性表 La next pb pa 习题 数据结构

(1)B(2)A(3)B(4)A(5)D(6)B(7)C(8)A(9)B(10)D(11)C(12)D(13)D(14)A(15)C

(1)

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)
{ //将两个递增的有序链表La和Lb合并为一个递增的有序链表Lc
   pa=La->next;    //pa是链表La的工作指针,初始化为首元结点
   pb=Lb->next;    //pb是链表Lb的工作指针,初始化为首元结点
   //pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的首元结点
   Lc=pc=La;       //用La的头结点作为Lc的头结点
while(pa&&pb)    //两个链表La和Lb均未到达表尾结点
{
      if(pa->data<pb->data)
      {  //取较小者La中的元素,将pa链接在pc的后面,pa指针后移
          pc->next=pa;
          pc=pa;
          pa=pa->next;
      }
      else if(pa->data>pb->data)
     {  //取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移
         pc->next=pb;
         pc=pb;
         pb=pb->next;
     }
      else
      {  //相等时取La中的元素,删除Lb中的元素
         pc->next=pa;
         pc=pa->next;
         q=pb->next;
         delete pb;
         pb=q;
      }
}
pc->next=pa?pa:pb;  //将非空表的剩余元素直接链接在Lc表的最后
delete Lb;                  //释放Lb的头结点
}

(2)

void MergeList (LinkList &La, LinkList &Lb, LinkList &Lc)
{//将两个非递减的有序链表La和Lb合并为一个非递增的有序链表Lc
     pa=La->next;      //pa是链表La的工作指针,初始化为首元结点
     pb=Lb->next;      //pb是链表Lb的工作指针,初始化为首元结点
     Lc=pc=La;           //用La的头结点作为Lc的头结点
     Lc->next=NULL;
     while (pal Ipb)     //只要有一一个表未到达表尾结点,用q指向待摘取的元素
    {
         if(!pa)     //La表为空,用q指向pb, pb指针后移
        {
            q=pb;
            pb=pb->next;
        }
        eise if(!pb)    //Lb表为空,用q指向pa, pa指针后移
       {  
            q=pa;
            pa=pa->next;
       }
       else if(pa->data<=pb->data)   //取较小者La中的元素,用q指向pa, pa指针后移
       {
            q=pa;
            pa=pa->next;
       }
       else           //取较小者Lb中的元素,用q指向pb, pb指针后移
       {
            q-pb;
            pb=pb->next ;
        }
        q->next=Lc->next; Le->next=q;    //将q指向的结点插在LC的表头结点之后
   }
   delete Lb;       //释放Lb的头结点
}

(3)

void Intersection (LinkList &La, LinkList &Lb, LinkList &Lc)
{//求两个递增的有序链表La和Lb的交集,使用头指针Lc指向
      pa=La->next;     //pa是链表La的工作指针,初始化为首元结点
      pb=Lb->next;     //pb是链表Lb的工作指针,初始化为首元结点
      Lc-pc=La;          //用La的头结点作为Lc的头结点
      while (pa 6&pb)       //两个链表La和Lb均未到达表尾结点
      {
             if (pa->data=-pb->data)     //相等,交集并人结果表中
            {
                  pc->next=pa; pc=pa; pa-pa->next;     
                  //取La中的元素,将pa链接在pc的后面,pa指针后移
                  u=pb; pb=pb->next; delete u;  
                 //删除Lb中的对应的相等元素
            }
            else if (pa->data<pb->data)         / /删除较小者La中的元素
            {  
                  u=pa;
                  pa=pa->next;
                  delete u;
            }
           else            //删除较小者Lb中的元素
           { 
                  u=pb;
                  pb=pb->next;
                  delete u;
            while(pa)            //Lb为空,删除非空表Ia中的所有元素
            {
                  u=pa;
                  pa=pa->next;
                  delete u;
            }
            while (pb)           //La为空,删除非空表Lb中的所有元素
            {
                  u=pb;
                  pb=pb- >next;
                  delete u;
            }
            pc->next =NULL;      //置链表LC尾标记
            delete Lb;            //释放Lb的头结点
}

(4)

void Difference (LinkList 6La, LinkList 6Lb, int &n)
{ //La 和Lb差集的结果存储于La中,n是结果集合中元素个数,调用时为0
      pa=La->next;      //pa 是链表La的工作指针,初始化为首元结点
      pb=Lb->next;      //pb是链表Lb的工作指针,初始化为首元结点
      pre=La;              //pre为La中pa所指结点的前驱结点的指针
      while (pas&pb)         //两个链表La和Lb均未到达表尾结点
      {
            if (pa->data<pb->data)     //A链表中当前结点指针后移
            {
                  n++;
                  pre=pa;
                  pa=pa->next;
            }
            else if (pa->data>pb->data)
                 pb=pb->next;          //B链表中当前结点指针后移
            else         //在La表删除La和Lb中元素值相同的结点
            {
                 pre->next=pa->next;
                 u=pa;
                 pa=pa->next;
                 delete u;              //删除结点
            }
      }
}

(5)

void Decompose (LinkList GA, LinkList &B, LinkList &C)
{ //单链表A分解为两个具有相同结构的链表B和C
        B=A;
        B->next=NULL;       //B表初始化
        C=new LNode;        //为C申请结点空间
        C->next=NULL;       //C初始化为空表
        P=A->next;             //p为工作指针
        while (p!=NULL)       //表A未到达表尾结点
        {
               r=p->next;          //暂存p的后继
               if(p->data<0)      //将小于0的结点链人B表,前插法
              {
                     p->next=B->next;
                     B->next=p;
               }
               else             //将大于0的结点链入C表,前插法
               {
                     p->next=C- >next;
                     C->next=p;
               } 
               p=r;              //p指向新的待处理结点
       }
}

(6)

ElemType Max (LinkList L)
{ //确定单链表中值最大的结点
        if(L->next==NULL) return NULL;
        pmax=L->next;          //pmax指向首元结点
        p=L->next->next;      //p指向第二个结点
        while (p!=NULL)        //遍历链表,如果下一个结点存在
        {
              if (p->data>pmax->data)
                     pmax=p;         //pmax指向数值大的结点
              p=p->next;            //p指向下一个结点,继续遍历
        }
        return pmax- >data;
}

(7)

void Inverse (LinkList &L)
{ //逆置带头结点的单链表L
        p=L->next;     //p指向首元结点
        L->next-NULL;      //头结点的指针域置为空
        while (p!=NULL)     //遍历链表,如果下一个结点存在
        {
              q=p->next;     //q指向*p的后继
              p->next=L->next;
              L->next=p;         //*p插入在头结点之后
              p=q;
        }
}

(8)

void DeleteMinMax (LinkList GL, int mink, int maxk)
( //删除递增有序链表L中值大于mink且小于maxk的所有元素
        p=L->next;          //p指向首元结点
        while (p&bp->data<=mink)     //查找第一 -个值大于mink的结点
        {
                pre=p;    //pre指向前驱结点
                p=p->next;
        }
        while (p&&p->data<maxk)    //查找第一个值大于等于maxk的结点
       {
               p=p->next;
               q-pre->next;
               pre->next=p;         //修改待删除结点的指针
       }
       while(q!=p)     //依次释放待删除结点的空间
      {
              s=q->next;
              delete q;
              q=s;
      }
}
}

(9)

void Exchange ( DuLinkList p)
{ //在双向循环链表,交换p所指向的结点及其前驱结点的顺序
        q=p->prior;                        //对应图2.14①
        q->prior ->next=p;            //对应图2.14②
        p->prior=q->prior;             //对应图2.14③
        q->next=p->next;             //对应图2.14④
        q->prior=p;                       //对应图2.14⑤
        p->next->prior=q;            //对应图2.14⑥
        p->next=q;                      //对应图2.14⑦
}

(10)

void DeleteItem(SqList &A, ElemType item)
{ //删除顺序表A中所有值为item的元素
     k=0;         //k记录值不等于item的元素个数
     for (i=0;i<A. length;i++)       //从前向后扫描顺序表
     {
           if(A.E1em[i]!=item)        //查找值不为item的元素
           {
                  A.Elem[k]=A.Elem[i];      //利用原表的空间记录值不为item的元素
                  k++;             //不等于item的元素增1
            }
      A.Length=k;            //顺序表A的长度等于k
}

 

标签:结点,Lb,线性表,La,next,pb,pa,习题,数据结构
From: https://www.cnblogs.com/Santariki/p/16814734.html

相关文章

  • 20221027数据结构与算法之线性表——顺序表
    广州疫情被封区,在家学习#pragmawarning(disable:4996)#include<stdio.h>#include<stdlib.h>//动态顺序表的实现typedefintdata_t;typedefstructSeqList{data_t*da......
  • 数据结构 玩转数据结构 4-5 从链表中删除元素
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13448 1重点关注1.1代码草图解析    2课程内容3Codi......
  • 【数据结构-数组】数组的基本操作
    目录1数据结构定义2插入操作3删除操作4按值查找1数据结构定义#defineMAX50typedefstruct{intdata[MAX];intlength;}SqList;初始化:voidIni......
  • 使用数据结构中的队列解决舞伴搭配问题
    ​ (一)问题描述某班有m个女生,n个男生(m不等于n,男女生人数和不能小于20),现要举办一个舞会,男女生分别编号坐在舞池两边的椅子上等待。每曲开始时,依次从男生和女生中各出一......
  • 数据结构 树(第10-14天)
    树的题目太多了,先总结一下树的遍历方式。按照根节点的遍历顺序。可以分为前序、中序、后序。前序遍历,即根–>左–>右的顺序。中序遍历,左–>根–>右。后续遍历,左–>右–>......
  • 数据结构 栈 / 队列(第9天)
    20.有效的括号判断输入的括号是否有效。左右括号··能闭合,顺序合适。思路:用栈实现。遇到左括号就保存在栈中,遇到右括号则需要从栈中弹出一个括号,与之配对。classSolutio......
  • 数据结构 链表(第7、8天)
    链表这里面的链表题比较简单,只要会遍历链表、删除链表节点、反转链表这些基本操作就行。必要时可以画图辅助理解。141.环形链表给定一个链表,判断是否有环。思路:快慢指针。......
  • 数据结构模板整合
    栈#include<iostream>#include<cstdio>#definemaxn100010usingnamespacestd;intn,x;template<typenametype>inlinevoidread(type&x){x=0;boolfl......
  • 基于C语言的通用型数据结构与容器库
    仓库地址:github:https://github.com/hellototoro/hlibcgitee:https://gitee.com/totorohello/hlibclist双向序列容器,用于将它们的元素保持为线性排列,并允许在序列的任何......
  • 数据结构 玩转数据结构 4-3 使用链表的虚拟头结点
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13446 1重点关注1.1代码草图解析 1.2为何为链表头设立虚拟头节点为......