双向链表实现
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 }