#include <iotream.h> #include <malloc.h> typedef int elemtype; typedef struct linknode { elemtype data; struct linknode *left,*right; } dnodetype; dnodetype *create()//建立一个双链表 { elemtype d; dnodetype *h=NULL,*s,*t; int i=1; cout<<"建立一个单链表"<<endl; while(1); { cout<<"输入第"<<i<<"个节点的data域值:"; cin>>d; if(d==0) break; if(i==0) { h=(dnodetype *)malloc(sizeof(dnodetype)); h->data=d; h->left=NULL; h->right=NULL; t=h; } else { s=(dnodetype *)malloc(sizeof(dnodetype)); s->data=d; s->right=NULL; s->left=t; t->right=s; t=s; } i++; } return h; } void disp(dnodetype *h)//打印出双链表 { dnodetype *p=h; cout<<"输出一个双链表"<<endl<<" "; if(p==NULL) cout<<"空表"<<endl; while(p!=NULL) { cout<<p->data<<"->"; p=p->right; } cout<<endl; } int len(dnodetype *h)//返回双链表的长度 { int i=0; dnodetype *p=h; if(p==NULL) return 0; while(p!=NULL) { p=p->right; i++; } return i; } dnodetype *find(dnodetype *h,int i)//返回第i个节点的指针 { dnodetype *p=h; int j=1; if(i<=0||i>len(h)) return NULL; else { while(p!=NULL&&j<i) { j++; p=p->right; } return p; } } dnodetype *ins(dnotype *h,int i,elemtype x)//在指定位置插入节点 { dnodetype *p, *s; s=(dnodetype *)malloc(sizeof(elemtype)); s->data=x; s->left=NULL; s->right=NULL; if(i==0) { s->right=h; h->left=s; h=s; } else { p=find(h,i); if(p!=NULL&&p->right!=NULL) { s->right=p->right; p->right->left=s; p->right=s; s->left=p; } else if(p!=NULL&&p->right==NULL) { s->left=p; p->right=s; } else { cout<<"输入i值不正确。"<<endl; } } return h; } dnodetype *del(dnodetype *h,int i)//删除一个指定的节点 { dnodetype *p=h; int j=1; if(i==1) { h=h->right; h->left=NULL; free(p); } else { p=find(h,i); if(p!=NULL&&p->right!=NULL) { p->left->right=p->right; p->right->left=p->left; free(p); } else if(p!=NULL&&p->right==NULL)//P是最后一个节点 { p->left->right=NULL; free(p); } else cout<<"输入的i值不正确."<<endl; } return h; } void dispose(dnodetype *h)//释放双链表所有节点的占用空间 { dnodetype *pa=h,*pb; if(pa!=NULL) { pb=pa->right; if(pb==NULL) free(pa); else { while(pb!=NULL) { free(pa); pa=pb; pb=pb->right; } free(pa); } } }