`
langzhe
  • 浏览: 288054 次
  • 性别: 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
分享到:
评论

相关推荐

    实现双向链表反转

    基于linkedList实现自己的双向链表反转。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    JAVA双向链表反转实现

    与单向链表不同,双向链表中的每个节点都有两个指针,一个指向前一个节点,另一个指向后一个节点。这使得在链表中的导航更加灵活,对于某些特定的操作,比如反转链表,提供了更高效的解决方案。 双向链表的节点通常...

    数据结构的双链表算法

    与单链表相比,双链表的特点在于每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针,这使得双向操作更加便捷。 在双链表中,有三个重要的概念:头节点、尾节点和普通节点。头节点不存储实际...

    [实验1]双链表与多项式.cpp

    编写使用freelist 的带头、尾结点的双向链表类的定义,实现双向链表的基本操作。 2. 利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数降序排列的多项式。 3. 最后提交完整的...

    Linux内核双向链表简单分析

    当链表为空时,这两个指针都指向链表自身,形成一个环形结构。`INIT_LIST_HEAD`宏用于初始化一个空链表,即让`next`和`prev`都指向自己。 #### 增加节点 Linux内核提供了两种添加节点的方式:头插法和尾插法。 - ...

    数据结构 双向链表(C++)

    双向链表与单链表不同,它允许每个节点不仅有一个指向前一个节点的指针,还有一个指向后一个节点的指针。这种设计使得双向链表在某些操作上比单链表更具优势,例如,向前或向后的遍历更为灵活。 1. **双向链表的...

    用双向链表做的n的阶乘

    在编程领域,双向链表是一种数据结构,它允许在列表中的元素之间进行前向和后向的导航。这种数据结构在处理需要频繁插入、删除或遍历操作的问题时特别有用。而“n的阶乘”是数学概念,表示1到n的所有整数的乘积,记...

    C++双向链表统计文章单词出现频率

    1. 双向链表的实现与操作。 2. 文件流的使用,包括打开、读取和关闭文件。 3. 字符串处理,如分割、清洗和转换。 4. 哈希映射(如`std::unordered_map`)用于快速查找和计数。 5. 自定义数据结构的设计和操作。 6. ...

    双向链表双向链表

    双向链表是一种特殊的链式数据结构,它与单向链表相比,增加了向前和向后指针,使得在链表中的元素可以双向遍历。这种数据结构在许多计算机科学和编程场景中都有广泛的应用,特别是在数据存储、算法实现以及高效操作...

    操作系统课设-线程安全的双向链表

    与单链表相比,双向链表允许我们在正向和反向两个方向上高效地遍历数据,但同时也增加了存储和操作的复杂性。 线程安全是多线程编程中的关键概念,意味着多个线程可以同时访问同一资源而不会导致数据错误或意外的...

    单链表、双链表、循环链表的操作

    循环链表是一种特殊的链表结构,其中最后一个节点的指针指向第一个节点,形成一个环形结构。循环链表的主要操作包括: * 获取指定位置的节点指针 * 获取链表的长度 * 判断链表是否为空 * 清空链表 * 遍历链表 * ...

    网上搜集的七种双向链表模板c++实现

    在实际应用中,这些模板可能包含额外的功能,如反转链表、查找特定元素、合并两个链表等。理解并熟练掌握这些模板,可以帮助程序员高效地处理数据,尤其是在需要动态添加、删除元素且需要保持顺序时。 总的来说,...

    双向链表的操作

    双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...

    stm32f103 双向链表

    在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...

    Java算法实例-双向链表操作

    双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的前进和后退操作变得相对高效。 双向链表的操作主要包括创建、插入、删除、遍历等。下面...

    双向链表.cpp 双向链表类定义及测试代码 c++

    双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材

    带头节点的双向链表

    双向链表与单链表的主要区别在于每个节点除了包含数据外,还包含两个指针,一个指向其前一个节点(prev),另一个指向其后一个节点(next)。这种设计使得在链表中进行插入和删除操作更加灵活,因为我们可以轻松地...

    双链表C语言实现

    通过理解这些基础操作,你可以根据需求扩展双链表的功能,例如查找特定节点、反转链表等。 在压缩包中的“双链表”和“双链表2”文件可能是包含了上述代码实现的源文件,你可以下载后进行学习和实践。通过阅读和...

    单行链表与双向链表问题实例

    例如,可能需要实现的功能包括插入新节点、删除特定节点或者反转链表。这些操作都需要对链表的指针进行修改,同时保持链表的正确连接。改变节点指针时要注意更新相邻节点的指针,以确保链表的完整性。 接下来,我们...

    链表反转 C/C++

    链表反转是链表操作中的一项基本技能,它涉及到链表节点之间的指针调整,使得链表的顺序与原顺序相反。本文将详细解析链表反转的原理以及C/C++语言下的实现方法。 ### 链表反转原理 链表由一系列节点组成,每个...

Global site tag (gtag.js) - Google Analytics