双链表

来源:互联网 发布:垃圾食品 知乎 编辑:程序博客网 时间:2024/06/06 18:21
#include<iostream>using namespace std;typedef struct DNode{ElemType data;struct DNode *prior;struct DNode *next;}DLinkList;void CreateListF(DLinkList *&L,ElemType a[],int n){DLinkList *s ;int i;L=(DLinkList *)malloc (sizeof(DLinkList));L->prior=L->next=NULL;for(i=0;i<n;i++){s=(DLinkList *)malloc (sizeof(DLinkList));s->data=a[i];s->next=L->next;if(L->next!=NULL)L->next->prior=s;L->next =s;s->prior=L;}}void CreateListR(DLinkList *&L ,ElemType a[],int n){DLinkList *s ,*r;int i;L=(DLinkList *)malloc (sizeof(DLinkList));L->prior =L->next=NULL;r=L;for(i=0;i<n;i++){s=(DLinkList *)malloc (sizeof(DLinkList));s->data=a[i];r->next=s;s->prior=r;r=s;}r->next=NULL;}int ListInsert(DLinkList *&L,int i,ElemType e){int j=0;DLinkList *p=L,*s;while(j<i-1&&p!=NULL){j++;p=p->next ;}if(p==NULL)return 0;else{s=(DLinkList *)malloc (sizeof(DLinkList));s->data=e;s->next=p->next;if(p->next!=NULL)p->next ->prior=s;p->next=s;s->prior=p;return 1;}}int ListDelete(DLinkList *&L,int i,ElemType &e){DLinkList *p =L,*q;int j=0;while(j<i-1&&p!=NULL){j++;p=p->next;}if(p=NULL)return 0;else{q=p->next;if(q==NULL)return 0;e=q->data;p->next=q->next;if(p->next!=NULL)p->next->prior=p;free(q);return 1;}}void reverse (DLinkList *&L)   //双链表逆置{DLinkList *p=L->next,*q;   //p指向第一个数据结点L->next=NULL;while(p!=NULL){q=p->next;            //q指向*p的直接后继结点p->next=L->next ;     //采用头插法将*p结点插入到双链表中if(L->next!=NULL)L->next ->prior=p;L->next=p;p->prior=L;p=q;}}void sort(DLinkList * &L)   //双链表元素排序{DLinkList *p=L->next,*q,*r;     //p指向第一个数据结点if(p!=NULL)                     //若元双链表中有一个或多个数据结点{r=p->next;                  //r保持*p结点直接后继结点的指针p->next=NULL;               //构造只含一个数据结点的有序表p=r;while(p!=NULL){r=p->next;               //r保持*p结点直接后继结点的指针q=L;while (q->next!=NULL&&q->next->data<p->data)q=q->next;           //在有序表中找插入*p的直接前驱结点*q到位置p->next=q->next;         //将*p插入到*q之后if(q->next!=NULL)q->next->prior=p;q->next=p;p->prior=q;p=r;}}}

原创粉丝点击