双向链表实现

  1 #include "stdio.h"
  2 #include "stdlib.h"  
  3 
  4 #define OK 1  
  5 #define ERROR 0  
  6 
  7 typedef char elemType;
  8 typedef struct _DuLNode{  
  9     elemType data;  
 10     struct _DuLNode *prior;  
 11     struct _DuLNode *Next;  
 12 }DuLNode,*DuLList;  
 13   
 14 
 15 int DuLNodeLength(DuLNode *L){  
 16     DuLNode *p=L->Next;  
 17     int length=0;  
 18     while((p!=NULL)&&(p!=L)){  
 19         p=p->Next;  
 20         length++;  
 21     }  
 22     return length;  
 23 }  
 24   
 25 
 26 int GetElem(DuLNode *L,int pos)  
 27 {  
 28     DuLNode *p=L->Next;  
 29     int j=1;  
 30     while((p!=L) && j<pos){  
 31         p=p->Next;  
 32         ++j;  
 33     }  
 34     if((p==L)||j>pos){
 35         printf("位置错误!\n");
 36         return ERROR;
 37     }  
 38     printf("位置%d处的元素是: %c\n",pos,p->data);  
 39     return OK;  
 40 }  
 41   
 42 //获取第pos个位置的元素的指针  
 43 DuLList GetElemP(DuLNode *L,int pos){  
 44     DuLNode *p=L;  
 45     int j;  
 46     for(j=1;j<=pos;j++)  
 47        p=p->Next;  
 48     return p;  
 49 }  
 50   
 51  
 52 int ListInsert(DuLNode *L,int pos,elemType e){  
 53     DuLNode *p,*s;  
 54     p=GetElemP(L,pos);  
 55     if(!p)  
 56         return ERROR; 
 57     if(!(s=(DuLNode *)malloc(sizeof(DuLNode)))) 
 58         return ERROR;  
 59     s->data=e;  
 60     s->prior=p->prior;  
 61     p->prior->Next=s;  
 62     s->Next=p;  
 63     p->prior=s;  
 64     return OK;  
 65 }  
 66 
 67 int ListDelete(DuLNode *L,int pos){  
 68     DuLNode *p;  
 69     elemType tmp;  
 70     p=GetElemP(L,pos);  
 71     if(!p)  
 72       return ERROR;  
 73     tmp=p->data;  
 74     p->prior->Next=p->Next;  
 75     p->Next->prior=p->prior;  
 76     free(p);  
 77     printf("删除第%d个位置的元素,该元素是:%c\n",pos,tmp);  
 78     return OK;  
 79 }  
 80   
 81  
 82 void TraverseList(DuLNode *L){  
 83     DuLNode *p=L->Next;  
 84     printf("正向遍历:\n");  
 85     while(p!=L){  
 86         printf("%c ",p->data);  
 87         p=p->Next;  
 88     }  
 89     printf("\n");  
 90 }  
 91   
 92 //逆向遍历双向循环链表  
 93 void TraverseBack(DuLNode *L){  
 94     DuLNode *p=L->prior;//指向尾结点  
 95     printf("逆向遍历:\n");  
 96     while(p!=L){  
 97         printf("%c ",p->data);  
 98         p=p->prior;  
 99     }  
100     printf("\n");  
101 }  
102   
103 void main(){  
104     DuLNode *L=(DuLNode *)malloc(sizeof(DuLNode));  
105     L->Next=L->prior=L;//循环链表  
106     ListInsert(L,1,'a');  
107     ListInsert(L,2,'b');  
108     ListInsert(L,3,'c');  
109     ListInsert(L,4,'d');  
110     printf("表长为%d\n",DuLNodeLength(L));  
111     TraverseList(L);  
112     GetElem(L, 1);  
113     GetElem(L, 2);  
114     GetElem(L, 3);  
115     ListDelete(L,2);  
116     TraverseList(L);  
117     TraverseBack(L);  
118     getchar();
119 }   

 

posted @ 2017-12-01 13:01  ixummer  阅读(263)  评论(0编辑  收藏  举报