main2-01~2-08.cpp 线性表检验主程序

本文通过多个C++程序示例展示了不同类型链表(如单链表、双链表、循环链表等)的基本操作,包括创建、插入、删除、查找、遍历等。这些示例覆盖了链表的主要应用场景和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1.  // main2-6.cpp 检验bo2-6.cpp的主程序
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-5.h"
  5.  #include"bo2-6.cpp"
  6.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  7.  void main()
  8.  {
  9.    Link p,h;
  10.    LinkList L;
  11.    Status i;
  12.    int j,k;
  13.    InitList(L); // 初始化空的线性表L
  14.    for(j=1;j<=2;j++)
  15.    {
  16.      MakeNode(p,j); // 生成由p指向、值为j的结点
  17.      InsFirst(L,L.tail,p); // 插在表尾
  18.    }
  19.    OrderInsert(L,0,comp); // 按升序插在有序表头
  20.    for(j=0;j<=3;j++)
  21.    {
  22.      i=LocateElem(L,j,p,comp);
  23.      if(i)
  24.        printf("链表中有值为%d的元素。/n",p->data);
  25.      else
  26.        printf("链表中没有值为%d的元素。/n",j);
  27.    }
  28.    printf("输出链表:");
  29.    ListTraverse(L,print); // 输出L
  30.    for(j=1;j<=4;j++)
  31.    {
  32.      printf("删除表头结点:");
  33.      DelFirst(L,L.head,p); // 删除L的首结点,并以p返回
  34.      if(p)
  35.        printf("%d/n",GetCurElem(p));
  36.      else
  37.        printf("表空,无法删除 p=%u/n",p);
  38.    }
  39.    printf("L中结点个数=%d L是否空 %d(1:空 0:否)/n",ListLength(L),ListEmpty(L));
  40.    MakeNode(p,10);
  41.    p->next=NULL; // 尾结点
  42.    for(j=4;j>=1;j--)
  43.    {
  44.      MakeNode(h,j*2);
  45.      h->next=p;
  46.      p=h;
  47.    } // h指向一串5个结点,其值依次是2 4 6 8 10
  48.    Append(L,h); // 把结点h链接在线性链表L的最后一个结点之后
  49.    OrderInsert(L,12,comp); // 按升序插在有序表尾头
  50.    OrderInsert(L,7,comp); // 按升序插在有序表中间
  51.    printf("输出链表:");
  52.    ListTraverse(L,print); // 输出L
  53.    for(j=1;j<=2;j++)
  54.    {
  55.      p=LocateElem(L,j*5,equal);
  56.      if(p)
  57.        printf("L中存在值为%d的结点。/n",j*5);
  58.      else
  59.        printf("L中不存在值为%d的结点。/n",j*5);
  60.    }
  61.    for(j=1;j<=2;j++)
  62.    {
  63.      LocatePos(L,j,p); // p指向L的第j个结点
  64.      h=PriorPos(L,p); // h指向p的前驱
  65.      if(h)
  66.        printf("%d的前驱是%d。/n",p->data,h->data);
  67.      else
  68.        printf("%d没前驱。/n",p->data);
  69.    }
  70.    k=ListLength(L);
  71.    for(j=k-1;j<=k;j++)
  72.    {
  73.      LocatePos(L,j,p); // p指向L的第j个结点
  74.      h=NextPos(p); // h指向p的后继
  75.      if(h)
  76.        printf("%d的后继是%d。/n",p->data,h->data);
  77.      else
  78.        printf("%d没后继。/n",p->data);
  79.    }
  80.    printf("L中结点个数=%d L是否空 %d(1:空 0:否)/n",ListLength(L),ListEmpty(L));
  81.    p=GetLast(L); // p指向最后一个结点
  82.    SetCurElem(p,15); // 将最后一个结点的值变为15
  83.    printf("第1个元素为%d 最后1个元素为%d/n",GetCurElem(GetHead(L)->next),GetCurElem(p));
  84.    MakeNode(h,10);
  85.    InsBefore(L,p,h); // 将10插到尾结点之前,p指向新结点
  86.    p=p->next; // p恢复为尾结点
  87.    MakeNode(h,20);
  88.    InsAfter(L,p,h); // 将20插到尾结点之后
  89.    k=ListLength(L);
  90.    printf("依次删除表尾结点并输出其值:");
  91.    for(j=0;j<=k;j++)
  92.      if(!(i=Remove(L,p))) // 删除不成功
  93.        printf("删除不成功 p=%u/n",p);
  94.      else
  95.        printf("%d ",p->data);
  96.    MakeNode(p,29); // 重建具有1个结点(29)的链表
  97.    InsFirst(L,L.head,p);
  98.    DestroyList(L); // 销毁线性链表L
  99.    printf("销毁线性链表L之后: L.head=%u L.tail=%u L.len=%d/n",L.head,L.tail,L.len);
  100.  }
 
  1.  // main2-7.cpp 检验bo2-7.cpp的主程序
  2.  #include"c1.h"
  3.  #include"c2-6.h"
  4.  #include"bo2-7.cpp"
  5.  void main()
  6.  {
  7.    polynomial p,q;
  8.    int m;
  9.    printf("请输入第1个一元多项式的非零项的个数:");
  10.    scanf("%d",&m);
  11.    CreatPolyn(p,m);
  12.    printf("请输入第2个一元多项式的非零项的个数:");
  13.    scanf("%d",&m);
  14.    CreatPolyn(q,m);
  15.    AddPolyn(p,q);
  16.    printf("2个一元多项式相加的结果:/n");
  17.    PrintPolyn(p);
  18.    printf("请输入第3个一元多项式的非零项的个数:");
  19.    scanf("%d",&m);
  20.    CreatPolyn(q,m);
  21.    AddPolyn1(p,q);
  22.    printf("2个一元多项式相加的结果(另一种方法):/n");
  23.    PrintPolyn(p);
  24.    printf("请输入第4个一元多项式的非零项的个数:");
  25.    scanf("%d",&m);
  26.    CreatPolyn(q,m);
  27.    SubtractPolyn(p,q);
  28.    printf("2个一元多项式相减的结果:/n");
  29.    PrintPolyn(p);
  30.    printf("请输入第5个一元多项式的非零项的个数:");
  31.    scanf("%d",&m);
  32.    CreatPolyn(q,m);
  33.    MultiplyPolyn(p,q);
  34.    printf("2个一元多项式相乘的结果:/n");
  35.    PrintPolyn(p);
  36.    DestroyPolyn(p);
  37.  }
  1.  // main2-8.cpp 检验bo2-8.cpp和bo2-9.cpp的主程序
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-2.h"
  5.  #include"bo2-8.cpp"
  6.  #include"bo2-9.cpp"
  7.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  8.  void main()
  9.  {
  10.    LinkList L;
  11.    ElemType e,e0;
  12.    Status i;
  13.    int j,k;
  14.    InitList(L);
  15.    for(j=1;j<=5;j++)
  16.    {
  17.      i=ListInsert(L,1,j);
  18.      if(!i) // 插入失败
  19.        exit(ERROR);
  20.    }
  21.    printf("在L的表头依次插入1~5后:L=");
  22.    ListTraverse(L,print); // 依次对元素调用print(),输出元素的值
  23.    i=ListEmpty(L);
  24.    printf("L是否空:i=%d(1:是 0:否)/n",i);
  25.    ClearList(L);
  26.    printf("清空L后:L=");
  27.    ListTraverse(L,print);
  28.    i=ListEmpty(L);
  29.    printf("L是否空:i=%d(1:是 0:否)/n",i);
  30.    for(j=1;j<=10;j++)
  31.      ListInsert(L,j,j);
  32.    printf("在L的表尾依次插入1~10后:L=");
  33.    ListTraverse(L,print);
  34.    i=GetElem(L,5,e);
  35.    if(i==OK)
  36.      printf("第5个元素的值为:%d/n",e);
  37.    for(j=0;j<=1;j++)
  38.    {
  39.      k=LocateElem(L,j,equal);
  40.      if(k)
  41.        printf("第%d个元素的值为%d/n",k,j);
  42.      else
  43.        printf("没有值为%d的元素/n",j);
  44.    }
  45.    for(j=1;j<=2;j++) // 测试头两个数据
  46.    {
  47.      GetElem(L,j,e0); // 把第j个数据赋给e0
  48.      i=PriorElem(L,e0,e); // 求e0的前驱
  49.      if(i==INFEASIBLE)
  50.        printf("元素%d无前驱/n",e0);
  51.      else
  52.        printf("元素%d的前驱为:%d/n",e0,e);
  53.    }
  54.    for(j=ListLength(L)-1;j<=ListLength(L);j++) // 最后两个数据
  55.    {
  56.      GetElem(L,j,e0); // 把第j个数据赋给e0
  57.      i=NextElem(L,e0,e); // 求e0的后继
  58.      if(i==INFEASIBLE)
  59.        printf("元素%d无后继/n",e0);
  60.      else
  61.        printf("元素%d的后继为:%d/n",e0,e);
  62.    }
  63.    k=ListLength(L); // k为表长
  64.    for(j=k+1;j>=k;j--)
  65.    {
  66.      i=ListDelete(L,j,e); // 删除第j个数据
  67.      if(i==ERROR)
  68.        printf("删除第%d个元素失败/n",j);
  69.      else
  70.        printf("删除第%d个元素成功,其值为:%d/n",j,e);
  71.    }
  72.    printf("依次输出L的元素:");
  73.    ListTraverse(L,print);
  74.    DestroyList(L);
  75.    printf("销毁L后:L=%u/n",L);
  76.  }
  1.  
// main2-1.cpp 检验bo2-1.cpp的主程序
  •  #include"c1.h"
  •  typedef int ElemType;
  •  #include"c2-1.h"
  •  #include"bo2-1.cpp"
  •  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  •  Status sq(ElemType c1,ElemType c2)
  •  { // 数据元素判定函数(平方关系),LocateElem()调用的函数
  •    if(c1==c2*c2)
  •      return TRUE;
  •    else
  •      return FALSE;
  •  }
  •  void dbl(ElemType &c)
  •  { // ListTraverse()调用的另一函数(元素值加倍)
  •    c*=2;
  •  }
  •  void main()
  •  {
  •    SqList L;
  •    ElemType e,e0;
  •    Status i;
  •    int j,k;
  •    InitList(L);
  •    printf("初始化L后:L.elem=%u L.length=%d L.listsize=%d/n",L.elem,L.length,L.listsize);
  •    for(j=1;j<=5;j++)
  •      i=ListInsert(L,1,j);
  •    printf("在L的表头依次插入1~5后:*L.elem=");
  •    for(j=1;j<=5;j++)
  •      cout<<*(L.elem+j-1)<<' ';
  •    cout<<endl;
  •    printf("L.elem=%u L.length=%d L.listsize=%d ",L.elem,L.length,L.listsize);
  •    i=ListEmpty(L);
  •    printf("L是否空:i=%d(1:是 0:否)/n",i);
  •    ClearList(L);
  •    printf("清空L后:L.elem=%u L.length=%d L.listsize=%d ",L.elem,L.length,L.listsize);
  •    i=ListEmpty(L);
  •    printf("L是否空:i=%d(1:是 0:否)/n",i);
  •    for(j=1;j<=10;j++)
  •      ListInsert(L,j,j);
  •    printf("在L的表尾依次插入1~10后:*L.elem=");
  •    for(j=1;j<=10;j++)
  •      cout<<*(L.elem+j-1)<<' ';
  •    cout<<endl;
  •    printf("L.elem=%u L.length=%d L.listsize=%d/n",L.elem,L.length,L.listsize);
  •    ListInsert(L,1,0);
  •    printf("在L的表头插入0后:*L.elem=");
  •    for(j=1;j<=ListLength(L);j++) // ListLength(L)为元素个数
  •      cout<<*(L.elem+j-1)<<' ';
  •    cout<<endl;
  •    printf("L.elem=%u(有可能改变) L.length=%d(改变) L.listsize=%d(改变)/n",L.elem,L.length,L.listsize);
  •    GetElem(L,5,e);
  •    printf("第5个元素的值为:%d/n",e);
  •    for(j=10;j<=11;j++)
  •    {
  •      k=LocateElem(L,j,equal);
  •      if(k) // k不为0,表明有符合条件的元素,且其位序为k
  •        printf("第%d个元素的值为%d/n",k,j);
  •      else
  •        printf("没有值为%d的元素/n",j);
  •    }
  •    for(j=3;j<=4;j++)
  •    {
  •      k=LocateElem(L,j,sq);
  •      if(k) // k不为0,表明有符合条件的元素,且其位序为k
  •        printf("第%d个元素的值为%d的平方/n",k,j);
  •      else
  •        printf("没有值为%d的平方的元素/n",j);
  •    }
  •    for(j=1;j<=2;j++) // 测试头两个数据
  •    {
  •      GetElem(L,j,e0); // 把第j个数据赋给e0
  •      i=PriorElem(L,e0,e); // 求e0的前驱
  •      if(i==INFEASIBLE)
  •        printf("元素%d无前驱/n",e0);
  •      else
  •        printf("元素%d的前驱为:%d/n",e0,e);
  •    }
  •    for(j=ListLength(L)-1;j<=ListLength(L);j++) // 最后两个数据
  •    {
  •      GetElem(L,j,e0); // 把第j个数据赋给e0
  •      i=NextElem(L,e0,e); // 求e0的后继
  •      if(i==INFEASIBLE)
  •        printf("元素%d无后继/n",e0);
  •      else
  •        printf("元素%d的后继为:%d/n",e0,e);
  •    }
  •    k=ListLength(L); // k为表长
  •    for(j=k+1;j>=k;j--)
  •    {
  •      i=ListDelete(L,j,e); // 删除第j个数据
  •      if(i==ERROR)
  •        printf("删除第%d个元素失败/n",j);
  •      else
  •        printf("删除第%d个元素成功,其值为:%d/n",j,e);
  •    }
  •    printf("依次输出L的元素:");
  •    ListTraverse(L,print1); // 依次对元素调用print1(),输出元素的值
  •    printf("L的元素值加倍后:");
  •    ListTraverse(L,dbl); // 依次对元素调用dbl(),元素值乘2
  •    ListTraverse(L,print1);
  •    DestroyList(L);
  •    printf("销毁L后:L.elem=%u L.length=%d L.listsize=%d/n",L.elem,L.length,L.listsize);
  •  }
 
  1.  // main2-2.cpp 检验bo2-2.cpp的主程序(与main2-1.cpp很像)
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-2.h" // 与main2-1.cpp不同
  5.  #include"bo2-2.cpp" // 与main2-1.cpp不同
  6.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  7.  void main()
  8.  { // 除了几个输出语句外,主程和main2-1.cpp很像
  9.    LinkList L; // 与main2-1.cpp不同
  10.    ElemType e,e0;
  11.    Status i;
  12.    int j,k;
  13.    InitList(L);
  14.    for(j=1;j<=5;j++)
  15.      i=ListInsert(L,1,j);
  16.    printf("在L的表头依次插入1~5后:L=");
  17.    ListTraverse(L,print); // 依次对元素调用print(),输出元素的值
  18.    i=ListEmpty(L);
  19.    printf("L是否空:i=%d(1:是 0:否)/n",i);
  20.    ClearList(L);
  21.    printf("清空L后:L=");
  22.    ListTraverse(L,print);
  23.    i=ListEmpty(L);
  24.    printf("L是否空:i=%d(1:是 0:否)/n",i);
  25.    for(j=1;j<=10;j++)
  26.      ListInsert(L,j,j);
  27.    printf("在L的表尾依次插入1~10后:L=");
  28.    ListTraverse(L,print);
  29.    GetElem(L,5,e);
  30.    printf("第5个元素的值为:%d/n",e);
  31.    for(j=0;j<=1;j++)
  32.    {
  33.      k=LocateElem(L,j,equal);
  34.      if(k)
  35.        printf("第%d个元素的值为%d/n",k,j);
  36.      else
  37.        printf("没有值为%d的元素/n",j);
  38.    }
  39.    for(j=1;j<=2;j++) // 测试头两个数据
  40.    {
  41.      GetElem(L,j,e0); // 把第j个数据赋给e0
  42.      i=PriorElem(L,e0,e); // 求e0的前驱
  43.      if(i==INFEASIBLE)
  44.        printf("元素%d无前驱/n",e0);
  45.      else
  46.        printf("元素%d的前驱为:%d/n",e0,e);
  47.    }
  48.    for(j=ListLength(L)-1;j<=ListLength(L);j++) // 最后两个数据
  49.    {
  50.      GetElem(L,j,e0); // 把第j个数据赋给e0
  51.      i=NextElem(L,e0,e); // 求e0的后继
  52.      if(i==INFEASIBLE)
  53.        printf("元素%d无后继/n",e0);
  54.      else
  55.        printf("元素%d的后继为:%d/n",e0,e);
  56.    }
  57.    k=ListLength(L); // k为表长
  58.    for(j=k+1;j>=k;j--)
  59.    {
  60.      i=ListDelete(L,j,e); // 删除第j个数据
  61.      if(i==ERROR)
  62.        printf("删除第%d个元素失败/n",j);
  63.      else
  64.        printf("删除第%d个元素成功,其值为:%d/n",j,e);
  65.    }
  66.    printf("依次输出L的元素:");
  67.    ListTraverse(L,print);
  68.    DestroyList(L);
  69.    printf("销毁L后:L=%u/n",L);
  70.  }
  1.  // main2-31.cpp 检验func2-2.cpp和bo2-31.cpp的主程序
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-3.h"
  5.  #include"func2-2.cpp" // 两种方法都适用的函数在此文件中
  6.  #include"bo2-31.cpp"
  7.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  8.  void main()
  9.  {
  10.    int j,k;
  11.    Status i;
  12.    ElemType e,e0;
  13.    SLinkList L;
  14.    InitList(L);
  15.    for(j=1;j<=5;j++)
  16.      i=ListInsert(L,1,j);
  17.    printf("在L的表头依次插入1~5后:L=");
  18.    ListTraverse(L,print);
  19.    i=ListEmpty(L);
  20.    printf("L是否空:i=%d(1:是 0:否)表L的长度=%d/n",i,ListLength(L));
  21.    ClearList(L);
  22.    printf("清空L后:L=");
  23.    ListTraverse(L,print);
  24.    i=ListEmpty(L);
  25.    printf("L是否空:i=%d(1:是 0:否)表L的长度=%d/n",i,ListLength(L));
  26.    for(j=1;j<=10;j++)
  27.      ListInsert(L,j,j);
  28.    printf("在L的表尾依次插入1~10后:L=");
  29.    ListTraverse(L,print);
  30.    GetElem(L,5,e);
  31.    printf("第5个元素的值为:%d/n",e);
  32.    for(j=0;j<=1;j++)
  33.    {
  34.      k=LocateElem(L,j);
  35.      if(k)
  36.        printf("值为%d的元素在静态链表中的位序为%d/n",j,k);
  37.      else
  38.        printf("没有值为%d的元素/n",j);
  39.    }
  40.    for(j=1;j<=2;j++) // 测试头两个数据
  41.    {
  42.      GetElem(L,j,e0); // 把第j个数据赋给e0
  43.      i=PriorElem(L,e0,e); // 求e0的前驱
  44.      if(!i)
  45.        printf("元素%d无前驱/n",e0);
  46.      else
  47.        printf("元素%d的前驱为:%d/n",e0,e);
  48.    }
  49.    for(j=ListLength(L)-1;j<=ListLength(L);j++) // 最后两个数据
  50.    {
  51.      GetElem(L,j,e0); // 把第j个数据赋给e0
  52.      i=NextElem(L,e0,e); // 求e0的后继
  53.      if(!i)
  54.        printf("元素%d无后继/n",e0);
  55.      else
  56.        printf("元素%d的后继为:%d/n",e0,e);
  57.    }
  58.    k=ListLength(L); // k为表长
  59.    for(j=k+1;j>=k;j--)
  60.    {
  61.      i=ListDelete(L,j,e); // 删除第j个数据
  62.      if(i)
  63.        printf("第%d个元素为%d,已删除。/n",j,e);
  64.      else
  65.        printf("删除第%d个元素失败(不存在此元素)。/n",j);
  66.    }
  67.    printf("依次输出L的元素:");
  68.    ListTraverse(L,print); // 依次对元素调用print(),输出元素的值
  69.  }

 

 

  1.  // main2-32.cpp 检验func2-2.cpp和bo2-32.cpp的主程序
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-3.h"
  5.  #include"func2-2.cpp" // 两种方法都适用的函数在此文件中
  6.  #include"bo2-32.cpp"
  7.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  8.  void main()
  9.  {
  10.    int j,k,La,Lb;
  11.    Status i;
  12.    ElemType e,e0;
  13.    SLinkList L;
  14.    InitSpace(L); // 建立备用链表
  15.    La=InitList(L); // 初始化链表La
  16.    Lb=InitList(L); // 初始化链表Lb
  17.    printf("La表空否?%d(1:空 0:否) La的表长=%d/n",ListEmpty(L,La),ListLength(L,La));
  18.    for(j=1;j<=5;j++)
  19.      ListInsert(L,La,1,j);
  20.    printf("在空表La的表头依次插入1~5后:La=");
  21.    ListTraverse(L,La,print);
  22.    for(j=1;j<=5;j++)
  23.      ListInsert(L,Lb,j,j);
  24.    printf("在空表Lb的表尾依次插入1~5后:Lb=");
  25.    ListTraverse(L,Lb,print);
  26.    printf("La表空否?%d(1:空 0:否) La的表长=%d/n",ListEmpty(L,La),ListLength(L,La));
  27.    ClearList(L,La);
  28.    printf("清空La后:La=");
  29.    ListTraverse(L,La,print);
  30.    printf("La表空否?%d(1:空 0:否) La的表长=%d/n",ListEmpty(L,La),ListLength(L,La));
  31.    for(j=2;j<8;j+=5)
  32.    {
  33.      i=GetElem(L,Lb,j,e);
  34.      if(i)
  35.        printf("Lb表的第%d个元素的值为:%d/n",j,e);
  36.      else
  37.        printf("Lb表不存在第%d个元素!/n",j,e);
  38.    }
  39.    for(j=0;j<=1;j++)
  40.    {
  41.      k=LocateElem(L,Lb,j);
  42.      if(k)
  43.        printf("Lb表中值为%d的元素在静态链表中的位序为%d/n",j,k);
  44.      else
  45.        printf("Lb表中没有值为%d的元素/n",j);
  46.    }
  47.    for(j=1;j<=2;j++) // 测试头两个数据
  48.    {
  49.      GetElem(L,Lb,j,e0); // 把第j个数据赋给e0
  50.      i=PriorElem(L,Lb,e0,e); // 求e0的前驱
  51.      if(!i)
  52.        printf("Lb表中的元素%d无前驱/n",e0);
  53.      else
  54.        printf("Lb表中元素%d的前驱为:%d/n",e0,e);
  55.    }
  56.    for(j=ListLength(L,Lb)-1;j<=ListLength(L,Lb);j++) // 最后两个数据
  57.    {
  58.      GetElem(L,Lb,j,e0); // 把第j个数据赋给e0
  59.      i=NextElem(L,Lb,e0,e); // 求e0的后继
  60.      if(!i)
  61.        printf("Lb表中元素%d无后继/n",e0);
  62.      else
  63.        printf("Lb表中元素%d的后继为:%d/n",e0,e);
  64.    }
  65.    k=ListLength(L,Lb); // k为表长
  66.    for(j=k+1;j>=k;j--)
  67.    {
  68.      i=ListDelete(L,Lb,j,e); // 删除第j个数据
  69.      if(i)
  70.        printf("Lb表中第%d个元素为%d,已删除。/n",j,e);
  71.      else
  72.        printf("删除Lb表中第%d个元素失败(不存在此元素)。/n",j);
  73.    }
  74.    printf("依次输出Lb的元素:");
  75.    ListTraverse(L,Lb,print); // 依次对元素调用print(),输出元素的值
  76.  }

 

  1.  // main2-4.cpp 单循环链表,检验bo2-4.cpp的主程序
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-2.h"
  5.  #include"bo2-4.cpp"
  6.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  7.  void main()
  8.  {
  9.    LinkList L;
  10.    ElemType e;
  11.    int j;
  12.    Status i;
  13.    InitList(L); // 初始化单循环链表L
  14.    i=ListEmpty(L);
  15.    printf("L是否空 i=%d(1:空 0:否)/n",i);
  16.    ListInsert(L,1,3); // 在L中依次插入3,5
  17.    ListInsert(L,2,5);
  18.    i=GetElem(L,1,e);
  19.    j=ListLength(L);
  20.    printf("L中数据元素个数=%d,第1个元素的值为%d。/n",j,e);
  21.    printf("L中的数据元素依次为:");
  22.    ListTraverse(L,print);
  23.    PriorElem(L,5,e); // 求元素5的前驱
  24.    printf("5前面的元素的值为%d。/n",e);
  25.    NextElem(L,3,e); // 求元素3的后继
  26.    printf("3后面的元素的值为%d。/n",e);
  27.    printf("L是否空 %d(1:空 0:否)/n",ListEmpty(L));
  28.    j=LocateElem(L,5,equal);
  29.    if(j)
  30.      printf("L的第%d个元素为5。/n",j);
  31.    else
  32.      printf("不存在值为5的元素/n");
  33.    i=ListDelete(L,2,e);
  34.    printf("删除L的第2个元素:/n");
  35.    if(i)
  36.    {
  37.      printf("删除的元素值为%d,现在L中的数据元素依次为:",e);
  38.      ListTraverse(L,print);
  39.    }
  40.    else
  41.      printf("删除不成功!/n");
  42.    ClearList(L);
  43.    printf("清空L后,L是否空:%d(1:空 0:否)/n",ListEmpty(L));
  44.    DestroyList(L);
  45.  }

 

  1.  // main2-5.cpp 检验bo2-5.cpp的主程序
  2.  #include"c1.h"
  3.  typedef int ElemType;
  4.  #include"c2-4.h"
  5.  #include"bo2-5.cpp"
  6.  #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
  7.  void main()
  8.  {
  9.    DuLinkList L;
  10.    int i,n;
  11.    Status j;
  12.    ElemType e;
  13.    InitList(L);
  14.    for(i=1;i<=5;i++)
  15.      ListInsert(L,i,i); // 在第i个结点之前插入i
  16.    printf("正序输出链表:");
  17.    ListTraverse(L,print); // 正序输出
  18.    printf("逆序输出链表:");
  19.    ListTraverseBack(L,print); // 逆序输出
  20.    n=2;
  21.    ListDelete(L,n,e); // 删除并释放第n个结点
  22.    printf("删除第%d个结点,值为%d,其余结点为:",n,e);
  23.    ListTraverse(L,print); // 正序输出
  24.    printf("链表的元素个数为%d/n",ListLength(L));
  25.    printf("链表是否空:%d(1:是 0:否)/n",ListEmpty(L));
  26.    ClearList(L); // 清空链表
  27.    printf("清空后,链表是否空:%d(1:是 0:否)/n",ListEmpty(L));
  28.    for(i=1;i<=5;i++)
  29.      ListInsert(L,i,i); // 重新插入5个结点
  30.    ListTraverse(L,print); // 正序输出
  31.    n=3;
  32.    j=GetElem(L,n,e); // 将链表的第n个元素赋值给e
  33.    if(j)
  34.      printf("链表的第%d个元素值为%d/n",n,e);
  35.    else
  36.      printf("不存在第%d个元素/n",n);
  37.    n=4;
  38.    i=LocateElem(L,n,equal);
  39.    if(i)
  40.      printf("等于%d的元素是第%d个/n",n,i);
  41.    else
  42.      printf("没有等于%d的元素/n",n);
  43.    j=PriorElem(L,n,e);
  44.    if(j)
  45.      printf("%d的前驱是%d/n",n,e);
  46.    else
  47.      printf("不存在%d的前驱/n",n);
  48.    j=NextElem(L,n,e);
  49.    if(j)
  50.      printf("%d的后继是%d/n",n,e);
  51.    else
  52.      printf("不存在%d的后继/n",n);
  53.    DestroyList(L);
  54.  }

 

 

<think>嗯,用户想了解线性表ADT的定义、声明及实现,包括头文件、实现文件和主程序示例。首先,我需要回忆一下线性表的基本概念。线性表是一种常见的数据结构,元素按顺序排列,支持插入、删除、访问等操作。ADT(抽象数据类型)意味着要定义其接口而不涉及具体实现。 接下来,用户提到定义与声明放在XXX.h,实现放在XXX.cpp,所以需要分别给出这两个文件的示例。要确保代码正确,比如使用模板类来支持泛型,这样线性表可以存储不同类型的数据。在头文件中,通常会包含类的声明,成员函数的前置声明,以及可能的异常处理,比如溢出或下溢情况。 实现文件里,各个成员函数的具体实现需要详细写出,比如构造函数分配内存,插入和删除操作的元素移动,以及动态数组的扩容策略。这里可能需要考虑当数组满时,如何高效地扩展容量,通常是加倍当前容量,避免频繁扩容。 主程序示例部分,应该展示如何包含头文件,实例化线性表对象,并进行插入、遍历、删除等操作。同时,异常处理也应该在这里体现,比如捕获可能的溢出异常。 在写作过程中,需要注意代码的规范性,比如头文件的保护宏,命名空间的使用,以及内存管理的正确性,如析构函数释放内存。此外,用户提到使用中文回答,所以所有注释和输出应该用中文,但代码本身还是保持英文关键字。 用户可能的问题可能涉及线性表的其他实现方式,如链表,或者动态数组的优化策略,比如扩容因子是否总是两倍。另外,还可能询问线性表的不同操作的时间复杂度,比如插入和删除在动态数组中的平均和最坏情况。需要提前准备好这些相关问题,以便用户进一步学习。</think>### 线性表ADT的定义与实现 #### 一、线性表ADT定义(SeqList.h) ```cpp // SeqList.h #ifndef SEQLIST_H #define SEQLIST_H template <typename T> class SeqList { private: T* data; // 存储元素的动态数组 int capacity; // 当前容量 int length; // 当前长度 public: SeqList(int initSize = 10); ~SeqList(); bool isEmpty() const; // 判断是否为空 int getLength() const; // 获取长度 bool getElem(int pos, T& e) const; // 获取元素 bool insert(int pos, const T& e); // 插入元素 bool remove(int pos, T& e); // 删除元素 void traverse() const; // 遍历元素 class Overflow{}; // 溢出异常类[^2] class Underflow{}; // 下溢异常类 }; #endif ``` #### 二、具体实现(SeqList.cpp) ```cpp // SeqList.cpp #include <iostream> #include "SeqList.h" template <typename T> SeqList<T>::SeqList(int initSize) { data = new T[initSize]; capacity = initSize; length = 0; } template <typename T> SeqList<T>::~SeqList() { delete[] data; } template <typename T> bool SeqList<T>::insert(int pos, const T& e) { if (pos < 1 || pos > length + 1) return false; if (length == capacity) throw Overflow(); // 触发扩容时可在此添加逻辑[^3] for (int i = length; i >= pos; --i) data[i] = data[i-1]; data[pos-1] = e; ++length; return true; } // 其他成员函数实现类似,此处省略... ``` #### 三、主程序示例(main.cpp) ```cpp #include <iostream> #include "SeqList.h" int main() { try { SeqList<int> list(5); list.insert(1, 10); // 插入元素 list.insert(2, 20); int elem; if (list.getElem(2, elem)) std::cout << "第二个元素: " << elem << std::endl; list.traverse(); } catch (SeqList<int>::Overflow) { std::cerr << "线性表已满" << std::endl; } return 0; } ``` ### 关键特性说明 1. **动态扩容机制**:当插入元素导致容量不足时,建议采用倍增策略重新分配内存(示例未展示,可添加`expand()`私有方法) 2. **时间复杂度**:插入/删除操作平均时间复杂度为$O(n)$,随机访问为$O(1)$[^4] 3. **异常处理**:通过嵌套类定义特定异常类型,增强代码健壮性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值