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 }