错误蛋疼的反转 temp引用的地址已经被改变了所以不能实现反转
105 void reverse(void)
106 {
107 link node = head->next;
108 link temp;
109 temp = head;
110 head->next = head->pre;
111 head->pre = temp ->next;
112 while(node!=head){
113 temp = node;
114 node->next = node->pre;
115 node->pre = temp->next;
116 node = temp->next;
117 }
118 }
119
120
蛋疼的反转 105 void reverse(void) 106 { 107 link node = head->next; 108 link temp; 109 temp = head; 110 head->next = head->pre; 111 head->pre = temp ->next; 112 while(node!=head){ 113 temp = node->next; 114 node->next = node->pre; 115 node->pre = temp; 116 node = temp; 117 } 118 } 119 120 100 //通过pre照样能实现反序 101 for(; node->pre!=head; node=node->pre){ 102 printf("node->item=%d\n", node->pre->item); 103 } 104 1 /* circular.h */ 2 3 #ifndef CIRCULAR_H 4 #define CIRCULAR_H 5 6 typedef struct node *link; 7 struct node { 8 int item; 9 link pre, next; 10 }; 11 12 link make_node( int item); 13 void free_node(link p); 14 link search( int key); 15 void insert(link p); 16 void delete(link p); 17 void traverse(void (*visit)(link)); 18 void destroy(void); 19 void enqueue(link p); 20 link dequeue(void); 21 link get_head(void); 22 void list_node(void); 23 void reverse(void); 24 #endif 1 /* circular.c */ 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include "circular.h" 5 6 struct node sentinel = {0, &sentinel, &sentinel}; 7 8 static link head = &sentinel; 9 10 link make_node( int item) 11 { 12 link p = malloc(sizeof *p); 13 p->item = item; 14 p->pre = p->next = NULL; 15 return p; 16 } 17 18 void insert(link p) 19 { 20 p->next = head->next; 21 head->next->pre = p; 22 head->next = p; 23 p->pre = head; 24 } 25 26 void delete(link p) 27 { 28 p->pre->next = p->next; 29 p->next->pre = p->pre; 30 } 31 32 33 34 void free_node(link p) 35 { 36 free(p); 37 } 38 39 link search( int key) 40 { 41 link p; 42 for(p=head->next; p!=head; p=p->next){ 43 if(p->item == key){ 44 return p; 45 } 46 } 47 return NULL; 48 } 49 50 void traverse(void (*visit)(link)) 51 { 52 link p; 53 for(p=head->next; p!=head; p=p->next){ 54 visit(p); 55 } 56 } 57 58 59 void destroy(void) 60 { 61 link q, p = head->next; 62 head->next = head; 63 head->pre = head; 64 while(p!=head){ 65 q = p; 66 p=p->next; 67 free_node(q); 68 } 69 } 70 71 void enqueue(link p) 72 { 73 insert(p); 74 } 75 76 link dequeue(void) 77 { 78 if(head->pre ==head){ 79 return NULL; 80 }else{ 81 link p = head->pre; 82 delete(p); 83 return p; 84 } 85 } 86 87 88 link get_head(void) 89 { 90 return head; 91 } 92 93 void list_node(void) 94 { 95 link node = head; 96 for(; node->next!=head; node=node->next){ 97 printf("node->item=%d\n", node->next->item); 98 } 99 }