头文件“2_3_3.h” # include<malloc.h> # include<stdlib.h> # include<iostream.h> typedef struct DuLNode{ int data; struct DuLNode *prior; struct DuLNode *next; }*DuLinkList; void CreateList(DuLinkList &L,int n){ //操作一 //逆位序输入n个元素的值,建立带表头结点的双向循环链线性表L L=(DuLinkList)malloc(sizeof(DuLNode)); DuLinkList p; L->next=L; //先建立一个带头结点的单链表 L->prior=L; for(int i=n;i>0;--i){ p=(DuLinkList)malloc(sizeof(DuLNode)); //生成新结点 cin>>p->data; L->next->prior=p;p->next=L->next; L->next=p;p->prior=L; } } void InitList(DuLinkList &L){ //初始化操作 L=(DuLinkList)malloc(sizeof(DuLNode)); //生成头结点 L->next=L; L->prior=L; } void DestroyList(DuLinkList &L){ //销毁操作 DuLinkList p=L,q=L->next; while(q!=L){ free(p); p=q; q=p->next; } free(p); p=NULL;L=NULL; } void ClearList(DuLinkList &L){ //置空操作 DuLinkList p=L->next,q=p->next; while(q!=L){ free(p); p=q; q=p->next; } free(p); p=NULL;L->next=L; } int ListEmpty(DuLinkList L){ //操作二 //判空操作 if(L->next!=L) return 0; return 1; } int ListLength(DuLinkList L){ //操作二 //求长度操作 DuLinkList p=L;int i=0; while(p->next!=L){ i++;p=p->next; } return i; } void GetElem(DuLinkList L,int i,int &e){ //操作三 //获取第i个元素的值,赋给e if(i<1||i>ListLength(L)) cout<<"有误"<<endl; else{ DuLinkList p=L->next;int j=1; while(p!=L&&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(DuLinkList L,int e,int(*compare)(int,int)){ //操作四 //遍历操作,返回线性表中值为e的位序,否则返回0 int i=0;DuLinkList p=L->next; while(p!=L){ i++; if(compare(e,p->data)) return i; p=p->next; } return 0; } void PriorElem(DuLinkList L,int cur_e,int &pre_e){ //操作五 //求前驱结点 DuLinkList p=L->next; if(p->data==cur_e) cout<<"第一个结点无前驱结点"<<endl; else{ while(p!=L){ if(p->data==cur_e){ pre_e=p->prior->data; break; } p=p->next; } if(p==L) cout<<"该结点不存在"<<endl; } } void NextElem(DuLinkList L,int cur_e,int &next_e){ //操作六 //求后继结点 DuLinkList p=L->next; while(p!=L){ if(p->data==cur_e){ if(p->next==L){ cout<<"最后一个结点没有后继"<<endl; break; } next_e=p->next->data; break; } p=p->next; if(p==L) cout<<"不存在该元素"<<endl; } } void ListInsert(DuLinkList &L,int i,int e){ //操作七 //插入操作 if(i<1||i>ListLength(L)+1) cout<<"有误"<<endl; else{ DuLinkList p=L,s;int j=1; while(j<i){ p=p->next;j++; } s=(DuLinkList)malloc(sizeof(DuLNode)); //生成结点 s->data=e; p->next->prior=s;s->next=p->next; p->next=s;s->prior=p; } } void ListDelete(DuLinkList &L,int i,int &e){ //操作八 //删除操作 if(i<1||i>ListLength(L)) cout<<"有误"<<endl; else{ DuLinkList p=L;int j=0; while(j<i){ j++;p=p->next; } e=p->data; p->prior->next=p->next; p->next->prior=p->prior; free(p);p=NULL; } } void visit(int e){ cout<<e<<" "; } void ListTraverse(DuLinkList L,void(*visit)(int)){ //遍历线性表 DuLinkList p=L->next; while(p!=L){ visit(p->data);p=p->next; } cout<<endl; } 主文件“test.cpp” # include"2_3_3.h" void main(){ cout<<"########测试操作一##########"<<endl; DuLinkList L; CreateList(L,3); ListTraverse(L,visit); cout<<"/n########测试操作二##########"<<endl; cout<<ListEmpty(L)<<endl; cout<<ListLength(L)<<endl; ClearList(L); cout<<ListEmpty(L)<<endl; cout<<ListLength(L)<<endl; DestroyList(L); cout<<"/n########测试操作三##########"<<endl; DuLinkList L1; CreateList(L1,3); int e; GetElem(L1,0,e); GetElem(L1,1,e); cout<<e<<endl; GetElem(L1,2,e); cout<<e<<endl; GetElem(L1,3,e); cout<<e<<endl; GetElem(L1,4,e); cout<<"/n########测试操作四##########"<<endl; cout<<LocateElem(L1,0,compare)<<endl; cout<<LocateElem(L1,1,compare)<<endl; cout<<LocateElem(L1,2,compare)<<endl; cout<<LocateElem(L1,3,compare)<<endl; cout<<LocateElem(L1,4,compare)<<endl; cout<<"/n########测试操作五##########"<<endl; int pre_e; PriorElem(L1,0,pre_e); PriorElem(L1,1,pre_e); PriorElem(L1,2,pre_e); cout<<pre_e<<endl; PriorElem(L1,3,pre_e); cout<<pre_e<<endl; PriorElem(L1,4,pre_e); cout<<"/n########测试操作六##########"<<endl; int next_e; NextElem(L1,0,next_e); NextElem(L1,1,next_e); cout<<next_e<<endl; NextElem(L1,2,next_e); cout<<next_e<<endl; NextElem(L1,3,next_e); NextElem(L1,4,next_e); cout<<"/n########测试操作七##########"<<endl; ListInsert(L1,0,1); ListInsert(L1,5,1); ListInsert(L1,1,0); ListInsert(L1,5,4); ListInsert(L1,6,5); ListTraverse(L1,visit); cout<<"/n########测试操作八##########"<<endl; ListDelete(L1,0,e); ListDelete(L1,7,e); ListDelete(L1,1,e); cout<<e<<endl; ListDelete(L1,5,e); cout<<e<<endl; ListTraverse(L1,visit); } 输出结果: