头文件 “2_3.h” # include<malloc.h> # include<stdlib.h> # include<iostream.h> typedef struct LNode{ int data; struct LNode *next; }*LinkList; void CreateList(LinkList &L,int n){ //操作一 //逆位序输入n个元素的值,建立带表头结点的单链线性表L L=(LinkList)malloc(sizeof(LNode)); LinkList p; L->next=NULL; //先建立一个带头结点的单链表 for(int i=n;i>0;--i){ p=(LinkList)malloc(sizeof(LNode)); //生成新结点 cin>>p->data; p->next=L->next;L->next=p; } } void InitList(LinkList &L){ //初始化操作 L=(LinkList)malloc(sizeof(LNode)); //生成头结点 L->next=NULL; } void DestroyList(LinkList &L){ //销毁操作 LinkList p=L,q=L->next; while(q){ free(p); p=q; q=p->next; } free(p); p=NULL;L=NULL; } void ClearList(LinkList &L){ //置空操作 LinkList p=L->next,q=p->next; while(q){ free(p); p=q; q=p->next; } free(p); p=NULL;L->next=NULL; } int ListEmpty(LinkList L){ //操作二 //判空操作 if(L->next) return 0; return 1; } int ListLength(LinkList L){ //操作二 //求长度操作 LinkList p=L;int i=0; while(p->next){ i++;p=p->next; } return i; } void GetElem(LinkList L,int i,int &e){ //操作三 //获取第i个元素的值,赋给e if(i<1||i>ListLength(L)) cout<<"有误"<<endl; else{ LinkList p=L->next;int j=1; while(p&&j<i){ p=p->next;j++; } e=p->data; //获取第i个元素的值 } } int compare(int e1,int e2){ if(e1==e2) return 1; return 0; } int LocateElem(LinkList L,int e,int(*compare)(int,int)){ //操作四 //遍历操作,返回线性表中值为e的位序,否则返回0 int i=0;LinkList p=L->next; while(p){ i++; if(compare(e,p->data)) return i; p=p->next; } return 0; } void PriorElem(LinkList L,int cur_e,int &pre_e){ //操作五 //求前驱结点 LinkList p=L,q=L->next; if(q->data==cur_e) cout<<"第1个元素元前驱"<<endl; else{ while(q){ if(q->data==cur_e){ pre_e=p->data; return; } p=p->next;q=q->next; } if(!q) cout<<"不存在该元素"<<endl; } } void NextElem(LinkList L,int cur_e,int &next_e){ //操作六 //求后继结点 LinkList p=L->next; while(p){ if(p->data==cur_e){ if(p->next==NULL){ cout<<"最后一个结点没有后继"<<endl; break; } next_e=p->next->data; break; } p=p->next; if(!p) cout<<"不存在该元素"<<endl; } } void ListInsert(LinkList &L,int i,int e){ //操作七 //插入操作 if(i<1||i>ListLength(L)+1) cout<<"有误"<<endl; else{ LinkList p=L,s;int j=1; while(j<i){ p=p->next;j++; } s=(LinkList)malloc(sizeof(LNode)); //生成结点 s->data=e; s->next=p->next;p->next=s; } } void ListDelete(LinkList &L,int i,int &e){ //操作八 //删除操作 if(i<1||i>ListLength(L)) cout<<"有误"<<endl; else{ LinkList p=L;int j=1; while(j<i){ j++;p=p->next; } LinkList q=p->next; e=q->data; p->next=q->next; free(q);q=NULL; } } void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){ //操作九 //已知顺序线性表La和Lb的元素按值非递减排列 //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排序 LinkList pa=La->next,pb=Lb->next,pc; Lc=pc=La; //用La的头结点作为Lc的头结点 while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; } else{ pc->next=pb;pc=pb;pb=pb->next; } } pc->next=(pa?pa:pb); //插入剩余段 free(Lb);Lb=NULL;La=NULL;pa=pb=NULL; } void visit(int e){ cout<<e<<" "; } void ListTraverse(LinkList L,void(*visit)(int)){ //遍历线性表 LinkList p=L->next; while(p){ visit(p->data);p=p->next; } } 主文件 “test.cpp” # include"2_3.h" void main(){ cout<<"#########测试操作一######"<<endl; LinkList L; CreateList(L,3); cout<<ListLength(L)<<endl; cout<<ListEmpty(L)<<endl; ListTraverse(L,visit); ClearList(L); ListTraverse(L,visit); DestroyList(L); cout<<"/n/n#########测试操作二######"<<endl; LinkList L1; InitList(L1); cout<<ListEmpty(L1)<<endl; cout<<ListLength(L1)<<endl; DestroyList(L1); cout<<"/n#########测试操作三######"<<endl; LinkList L2; int e; CreateList(L2,3); ListTraverse(L2,visit); cout<<endl; GetElem(L2,0,e); GetElem(L2,1,e); cout<<e<<endl; GetElem(L2,2,e); cout<<e<<endl; GetElem(L2,3,e); cout<<e<<endl; GetElem(L2,4,e); cout<<"/n#########测试操作四######"<<endl; cout<<LocateElem(L2,4,compare)<<endl; cout<<LocateElem(L2,3,compare)<<endl; cout<<"/n#########测试操作五######"<<endl; int pre_e; PriorElem(L2,1,pre_e); PriorElem(L2,2,pre_e); cout<<pre_e<<endl; PriorElem(L2,4,pre_e); cout<<endl; cout<<"#########测试操作六######"<<endl; int next_e; NextElem(L2,0,next_e); NextElem(L2,1,next_e); cout<<next_e<<endl; NextElem(L2,2,next_e); cout<<next_e<<endl; NextElem(L2,3,next_e); NextElem(L2,4,next_e); cout<<"/n#########测试操作七######"<<endl; ListTraverse(L2,visit); ListInsert(L2,0,1); ListInsert(L2,1,0); ListTraverse(L2,visit); ListInsert(L2,5,4); cout<<endl; ListTraverse(L2,visit); ListInsert(L2,7,4); cout<<"/n#########测试操作八######"<<endl; ListDelete(L2,0,e); ListDelete(L2,1,e); cout<<e<<endl; ListTraverse(L2,visit); ListDelete(L2,4,e); cout<<endl<<e<<endl; ListTraverse(L2,visit); cout<<endl; ListDelete(L2,4,e); DestroyList(L2); cout<<"/n#########测试操作九######"<<endl; LinkList La,Lb,Lc; CreateList(La,3); ListTraverse(La,visit);cout<<endl; CreateList(Lb,3); ListTraverse(Lb,visit);cout<<endl; InitList(Lc); MergeList(La,Lb,Lc); ListTraverse(Lc,visit);cout<<endl; } 输出结果: