- // main2-6.cpp 检验bo2-6.cpp的主程序
- #include"c1.h"
- typedef int ElemType;
- #include"c2-5.h"
- #include"bo2-6.cpp"
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- {
- Link p,h;
- LinkList L;
- Status i;
- int j,k;
- InitList(L); // 初始化空的线性表L
- for(j=1;j<=2;j++)
- {
- MakeNode(p,j); // 生成由p指向、值为j的结点
- InsFirst(L,L.tail,p); // 插在表尾
- }
- OrderInsert(L,0,comp); // 按升序插在有序表头
- for(j=0;j<=3;j++)
- {
- i=LocateElem(L,j,p,comp);
- if(i)
- printf("链表中有值为%d的元素。/n",p->data);
- else
- printf("链表中没有值为%d的元素。/n",j);
- }
- printf("输出链表:");
- ListTraverse(L,print); // 输出L
- for(j=1;j<=4;j++)
- {
- printf("删除表头结点:");
- DelFirst(L,L.head,p); // 删除L的首结点,并以p返回
- if(p)
- printf("%d/n",GetCurElem(p));
- else
- printf("表空,无法删除 p=%u/n",p);
- }
- printf("L中结点个数=%d L是否空 %d(1:空 0:否)/n",ListLength(L),ListEmpty(L));
- MakeNode(p,10);
- p->next=NULL; // 尾结点
- for(j=4;j>=1;j--)
- {
- MakeNode(h,j*2);
- h->next=p;
- p=h;
- } // h指向一串5个结点,其值依次是2 4 6 8 10
- Append(L,h); // 把结点h链接在线性链表L的最后一个结点之后
- OrderInsert(L,12,comp); // 按升序插在有序表尾头
- OrderInsert(L,7,comp); // 按升序插在有序表中间
- printf("输出链表:");
- ListTraverse(L,print); // 输出L
- for(j=1;j<=2;j++)
- {
- p=LocateElem(L,j*5,equal);
- if(p)
- printf("L中存在值为%d的结点。/n",j*5);
- else
- printf("L中不存在值为%d的结点。/n",j*5);
- }
- for(j=1;j<=2;j++)
- {
- LocatePos(L,j,p); // p指向L的第j个结点
- h=PriorPos(L,p); // h指向p的前驱
- if(h)
- printf("%d的前驱是%d。/n",p->data,h->data);
- else
- printf("%d没前驱。/n",p->data);
- }
- k=ListLength(L);
- for(j=k-1;j<=k;j++)
- {
- LocatePos(L,j,p); // p指向L的第j个结点
- h=NextPos(p); // h指向p的后继
- if(h)
- printf("%d的后继是%d。/n",p->data,h->data);
- else
- printf("%d没后继。/n",p->data);
- }
- printf("L中结点个数=%d L是否空 %d(1:空 0:否)/n",ListLength(L),ListEmpty(L));
- p=GetLast(L); // p指向最后一个结点
- SetCurElem(p,15); // 将最后一个结点的值变为15
- printf("第1个元素为%d 最后1个元素为%d/n",GetCurElem(GetHead(L)->next),GetCurElem(p));
- MakeNode(h,10);
- InsBefore(L,p,h); // 将10插到尾结点之前,p指向新结点
- p=p->next; // p恢复为尾结点
- MakeNode(h,20);
- InsAfter(L,p,h); // 将20插到尾结点之后
- k=ListLength(L);
- printf("依次删除表尾结点并输出其值:");
- for(j=0;j<=k;j++)
- if(!(i=Remove(L,p))) // 删除不成功
- printf("删除不成功 p=%u/n",p);
- else
- printf("%d ",p->data);
- MakeNode(p,29); // 重建具有1个结点(29)的链表
- InsFirst(L,L.head,p);
- DestroyList(L); // 销毁线性链表L
- printf("销毁线性链表L之后: L.head=%u L.tail=%u L.len=%d/n",L.head,L.tail,L.len);
- }
- // main2-7.cpp 检验bo2-7.cpp的主程序
- #include"c1.h"
- #include"c2-6.h"
- #include"bo2-7.cpp"
- void main()
- {
- polynomial p,q;
- int m;
- printf("请输入第1个一元多项式的非零项的个数:");
- scanf("%d",&m);
- CreatPolyn(p,m);
- printf("请输入第2个一元多项式的非零项的个数:");
- scanf("%d",&m);
- CreatPolyn(q,m);
- AddPolyn(p,q);
- printf("2个一元多项式相加的结果:/n");
- PrintPolyn(p);
- printf("请输入第3个一元多项式的非零项的个数:");
- scanf("%d",&m);
- CreatPolyn(q,m);
- AddPolyn1(p,q);
- printf("2个一元多项式相加的结果(另一种方法):/n");
- PrintPolyn(p);
- printf("请输入第4个一元多项式的非零项的个数:");
- scanf("%d",&m);
- CreatPolyn(q,m);
- SubtractPolyn(p,q);
- printf("2个一元多项式相减的结果:/n");
- PrintPolyn(p);
- printf("请输入第5个一元多项式的非零项的个数:");
- scanf("%d",&m);
- CreatPolyn(q,m);
- MultiplyPolyn(p,q);
- printf("2个一元多项式相乘的结果:/n");
- PrintPolyn(p);
- DestroyPolyn(p);
- }
- // main2-8.cpp 检验bo2-8.cpp和bo2-9.cpp的主程序
- #include"c1.h"
- typedef int ElemType;
- #include"c2-2.h"
- #include"bo2-8.cpp"
- #include"bo2-9.cpp"
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- {
- LinkList L;
- ElemType e,e0;
- Status i;
- int j,k;
- InitList(L);
- for(j=1;j<=5;j++)
- {
- i=ListInsert(L,1,j);
- if(!i) // 插入失败
- exit(ERROR);
- }
- printf("在L的表头依次插入1~5后:L=");
- ListTraverse(L,print); // 依次对元素调用print(),输出元素的值
- i=ListEmpty(L);
- printf("L是否空:i=%d(1:是 0:否)/n",i);
- ClearList(L);
- printf("清空L后:L=");
- ListTraverse(L,print);
- 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=");
- ListTraverse(L,print);
- i=GetElem(L,5,e);
- if(i==OK)
- printf("第5个元素的值为:%d/n",e);
- for(j=0;j<=1;j++)
- {
- k=LocateElem(L,j,equal);
- if(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,print);
- DestroyList(L);
- printf("销毁L后:L=%u/n",L);
- }
- #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);
- }
- // main2-2.cpp 检验bo2-2.cpp的主程序(与main2-1.cpp很像)
- #include"c1.h"
- typedef int ElemType;
- #include"c2-2.h" // 与main2-1.cpp不同
- #include"bo2-2.cpp" // 与main2-1.cpp不同
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- { // 除了几个输出语句外,主程和main2-1.cpp很像
- LinkList L; // 与main2-1.cpp不同
- ElemType e,e0;
- Status i;
- int j,k;
- InitList(L);
- for(j=1;j<=5;j++)
- i=ListInsert(L,1,j);
- printf("在L的表头依次插入1~5后:L=");
- ListTraverse(L,print); // 依次对元素调用print(),输出元素的值
- i=ListEmpty(L);
- printf("L是否空:i=%d(1:是 0:否)/n",i);
- ClearList(L);
- printf("清空L后:L=");
- ListTraverse(L,print);
- 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=");
- ListTraverse(L,print);
- GetElem(L,5,e);
- printf("第5个元素的值为:%d/n",e);
- for(j=0;j<=1;j++)
- {
- k=LocateElem(L,j,equal);
- if(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,print);
- DestroyList(L);
- printf("销毁L后:L=%u/n",L);
- }
- // main2-31.cpp 检验func2-2.cpp和bo2-31.cpp的主程序
- #include"c1.h"
- typedef int ElemType;
- #include"c2-3.h"
- #include"func2-2.cpp" // 两种方法都适用的函数在此文件中
- #include"bo2-31.cpp"
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- {
- int j,k;
- Status i;
- ElemType e,e0;
- SLinkList L;
- InitList(L);
- for(j=1;j<=5;j++)
- i=ListInsert(L,1,j);
- printf("在L的表头依次插入1~5后:L=");
- ListTraverse(L,print);
- i=ListEmpty(L);
- printf("L是否空:i=%d(1:是 0:否)表L的长度=%d/n",i,ListLength(L));
- ClearList(L);
- printf("清空L后:L=");
- ListTraverse(L,print);
- i=ListEmpty(L);
- printf("L是否空:i=%d(1:是 0:否)表L的长度=%d/n",i,ListLength(L));
- for(j=1;j<=10;j++)
- ListInsert(L,j,j);
- printf("在L的表尾依次插入1~10后:L=");
- ListTraverse(L,print);
- GetElem(L,5,e);
- printf("第5个元素的值为:%d/n",e);
- for(j=0;j<=1;j++)
- {
- k=LocateElem(L,j);
- if(k)
- printf("值为%d的元素在静态链表中的位序为%d/n",j,k);
- 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)
- 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)
- 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)
- printf("第%d个元素为%d,已删除。/n",j,e);
- else
- printf("删除第%d个元素失败(不存在此元素)。/n",j);
- }
- printf("依次输出L的元素:");
- ListTraverse(L,print); // 依次对元素调用print(),输出元素的值
- }
- // main2-32.cpp 检验func2-2.cpp和bo2-32.cpp的主程序
- #include"c1.h"
- typedef int ElemType;
- #include"c2-3.h"
- #include"func2-2.cpp" // 两种方法都适用的函数在此文件中
- #include"bo2-32.cpp"
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- {
- int j,k,La,Lb;
- Status i;
- ElemType e,e0;
- SLinkList L;
- InitSpace(L); // 建立备用链表
- La=InitList(L); // 初始化链表La
- Lb=InitList(L); // 初始化链表Lb
- printf("La表空否?%d(1:空 0:否) La的表长=%d/n",ListEmpty(L,La),ListLength(L,La));
- for(j=1;j<=5;j++)
- ListInsert(L,La,1,j);
- printf("在空表La的表头依次插入1~5后:La=");
- ListTraverse(L,La,print);
- for(j=1;j<=5;j++)
- ListInsert(L,Lb,j,j);
- printf("在空表Lb的表尾依次插入1~5后:Lb=");
- ListTraverse(L,Lb,print);
- printf("La表空否?%d(1:空 0:否) La的表长=%d/n",ListEmpty(L,La),ListLength(L,La));
- ClearList(L,La);
- printf("清空La后:La=");
- ListTraverse(L,La,print);
- printf("La表空否?%d(1:空 0:否) La的表长=%d/n",ListEmpty(L,La),ListLength(L,La));
- for(j=2;j<8;j+=5)
- {
- i=GetElem(L,Lb,j,e);
- if(i)
- printf("Lb表的第%d个元素的值为:%d/n",j,e);
- else
- printf("Lb表不存在第%d个元素!/n",j,e);
- }
- for(j=0;j<=1;j++)
- {
- k=LocateElem(L,Lb,j);
- if(k)
- printf("Lb表中值为%d的元素在静态链表中的位序为%d/n",j,k);
- else
- printf("Lb表中没有值为%d的元素/n",j);
- }
- for(j=1;j<=2;j++) // 测试头两个数据
- {
- GetElem(L,Lb,j,e0); // 把第j个数据赋给e0
- i=PriorElem(L,Lb,e0,e); // 求e0的前驱
- if(!i)
- printf("Lb表中的元素%d无前驱/n",e0);
- else
- printf("Lb表中元素%d的前驱为:%d/n",e0,e);
- }
- for(j=ListLength(L,Lb)-1;j<=ListLength(L,Lb);j++) // 最后两个数据
- {
- GetElem(L,Lb,j,e0); // 把第j个数据赋给e0
- i=NextElem(L,Lb,e0,e); // 求e0的后继
- if(!i)
- printf("Lb表中元素%d无后继/n",e0);
- else
- printf("Lb表中元素%d的后继为:%d/n",e0,e);
- }
- k=ListLength(L,Lb); // k为表长
- for(j=k+1;j>=k;j--)
- {
- i=ListDelete(L,Lb,j,e); // 删除第j个数据
- if(i)
- printf("Lb表中第%d个元素为%d,已删除。/n",j,e);
- else
- printf("删除Lb表中第%d个元素失败(不存在此元素)。/n",j);
- }
- printf("依次输出Lb的元素:");
- ListTraverse(L,Lb,print); // 依次对元素调用print(),输出元素的值
- }
- // main2-4.cpp 单循环链表,检验bo2-4.cpp的主程序
- #include"c1.h"
- typedef int ElemType;
- #include"c2-2.h"
- #include"bo2-4.cpp"
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- {
- LinkList L;
- ElemType e;
- int j;
- Status i;
- InitList(L); // 初始化单循环链表L
- i=ListEmpty(L);
- printf("L是否空 i=%d(1:空 0:否)/n",i);
- ListInsert(L,1,3); // 在L中依次插入3,5
- ListInsert(L,2,5);
- i=GetElem(L,1,e);
- j=ListLength(L);
- printf("L中数据元素个数=%d,第1个元素的值为%d。/n",j,e);
- printf("L中的数据元素依次为:");
- ListTraverse(L,print);
- PriorElem(L,5,e); // 求元素5的前驱
- printf("5前面的元素的值为%d。/n",e);
- NextElem(L,3,e); // 求元素3的后继
- printf("3后面的元素的值为%d。/n",e);
- printf("L是否空 %d(1:空 0:否)/n",ListEmpty(L));
- j=LocateElem(L,5,equal);
- if(j)
- printf("L的第%d个元素为5。/n",j);
- else
- printf("不存在值为5的元素/n");
- i=ListDelete(L,2,e);
- printf("删除L的第2个元素:/n");
- if(i)
- {
- printf("删除的元素值为%d,现在L中的数据元素依次为:",e);
- ListTraverse(L,print);
- }
- else
- printf("删除不成功!/n");
- ClearList(L);
- printf("清空L后,L是否空:%d(1:空 0:否)/n",ListEmpty(L));
- DestroyList(L);
- }
- // main2-5.cpp 检验bo2-5.cpp的主程序
- #include"c1.h"
- typedef int ElemType;
- #include"c2-4.h"
- #include"bo2-5.cpp"
- #include"func2-3.cpp" // 包括equal()、comp()、print()、print2()和print1()函数
- void main()
- {
- DuLinkList L;
- int i,n;
- Status j;
- ElemType e;
- InitList(L);
- for(i=1;i<=5;i++)
- ListInsert(L,i,i); // 在第i个结点之前插入i
- printf("正序输出链表:");
- ListTraverse(L,print); // 正序输出
- printf("逆序输出链表:");
- ListTraverseBack(L,print); // 逆序输出
- n=2;
- ListDelete(L,n,e); // 删除并释放第n个结点
- printf("删除第%d个结点,值为%d,其余结点为:",n,e);
- ListTraverse(L,print); // 正序输出
- printf("链表的元素个数为%d/n",ListLength(L));
- printf("链表是否空:%d(1:是 0:否)/n",ListEmpty(L));
- ClearList(L); // 清空链表
- printf("清空后,链表是否空:%d(1:是 0:否)/n",ListEmpty(L));
- for(i=1;i<=5;i++)
- ListInsert(L,i,i); // 重新插入5个结点
- ListTraverse(L,print); // 正序输出
- n=3;
- j=GetElem(L,n,e); // 将链表的第n个元素赋值给e
- if(j)
- printf("链表的第%d个元素值为%d/n",n,e);
- else
- printf("不存在第%d个元素/n",n);
- n=4;
- i=LocateElem(L,n,equal);
- if(i)
- printf("等于%d的元素是第%d个/n",n,i);
- else
- printf("没有等于%d的元素/n",n);
- j=PriorElem(L,n,e);
- if(j)
- printf("%d的前驱是%d/n",n,e);
- else
- printf("不存在%d的前驱/n",n);
- j=NextElem(L,n,e);
- if(j)
- printf("%d的后继是%d/n",n,e);
- else
- printf("不存在%d的后继/n",n);
- DestroyList(L);
- }