`
langzhe
  • 浏览: 277499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

环形双链表与蛋疼的链表反转

    博客分类:
  • c
 
阅读更多

 

 


错误蛋疼的反转 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 }

 

 

  • 大小: 2.5 MB
0
7
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics