c語言_數據結構_雙向循環鏈表

雙向循環鏈表與單向循環鏈表的區別在於,每個節點的指針域中除了有指向下一結點的next指針外,還有指向前一結點的prev指針:

 

在鏈表中,中間部分結點的next指針指向其直接後繼結點,prev指針指向其直接前繼結點。與單向循環鏈表相同,末結點的next指針不再指向NULL,而是指向頭結點Head,而頭結點的prev則指向末結點。

c語言_數據結構_雙向循環鏈表


將新結點new插入到p所指向的結點之後:

c語言_數據結構_雙向循環鏈表

 

  1. ① new->prev = p;  
  2. ② new->next = p->next;  
  3. ③ p->next = new;  
  4. ④ new->next->prve = new;  

 

刪除p結點:

c語言_數據結構_雙向循環鏈表

  1. ① p->prev->next = p->next;  
  2. ② p->next->prev = p->prev;  
  3. ③ free(p);  

 

雙向循環鏈表的實現:

功能:在鏈表的結點中分別存放1、2、3、4、5、6、7、8、9、10,並進行相關操作,實現奇數升序偶數降序,即1、3、5、7、9、10、8、6、4、2。

基本思路:

從末結點向前遍歷,從遍歷到的第二個偶數結點開始,將偶數結點移動至末結點。

c語言_數據結構_雙向循環鏈表


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. typedef int datatype;  
  5.    
  6. typedef struct node  
  7. {  
  8.    datatype data;  
  9.    struct node *prev;  
  10.    struct node *next;  
  11.    
  12. }dlistnode, *dlinklist;  
  13.    
  14. //初始化  
  15. dlinklist init_list(void)  
  16. {  
  17.    dlinklist head = (dlinklist)malloc(sizeof(dlistnode));  
  18.    head->prev = head;  
  19.    head->next = head;  
  20.    
  21.    return head;  
  22. }  
  23.    
  24. //插入新結點  
  25. void insert(dlinklist head, datatype i)  
  26. {  
  27.    dlinklist newnode = (dlinklist)malloc(sizeof(dlistnode));  
  28.   
  29.    //直接改指針,不需要遍歷,不需要中間結點。  
  30.    newnode->data = i;   
  31.    
  32.    newnode->prev = head->prev;  
  33.    newnode->next = head;  
  34.    newnode->prev->next = newnode;  
  35.    head->prev = newnode;  
  36. }  
  37.    
  38. void show(dlinklist head)  
  39. {  
  40.    dlinklist p = head->next;  
  41.    
  42.    while(p != head)  
  43.    {  
  44.       printf("%d\t", p->data);  
  45.       p = p->next;  
  46.    }  
  47.   
  48.    printf("\n");  
  49. }  
  50.    
  51. //升降序操作:  
  52. void rearrange(dlinklist head)  
  53. {  
  54.    dlinklist p, q;  
  55.    int i = 0;  
  56.   
  57.    for(p=head->prev; p != head; p=p->prev)  
  58.    {  
  59.    //從末結點往前遍歷,從第二個偶數開始,將偶數結點搬移到末結點  
  60.        if(p->data % 2 == 0 && i != 0)  
  61.        {  
  62.          p->prev->next = p->next;  
  63.          p->next->prev = p->prev;  
  64.    
  65.          p->prev = head->prev;  
  66.          p->next = head;  
  67.    
  68.          head->prev->next = p;  
  69.          head->prev = p;  
  70.   
  71.          //由於p所指的結點已成爲末結點,爲避免歷遍出錯,將p指向最近歷遍的奇結點。  
  72.    
  73.          p = q;  
  74.       }  
  75.    //記錄最近歷遍奇數結點位置  
  76.    
  77.       q = p;  
  78.    
  79.       i++;  
  80.    }  
  81. }  
  82.    
  83. int main(void)  
  84. {  
  85.    dlinklist head;  
  86.    int n;  
  87.    int i;  
  88.   
  89.    head = init_list();  
  90.    scanf("%d", &n);  
  91.   
  92.    for(i=1; i<=n; i++)  
  93.    {  
  94.       insert(head, i);  
  95.    }  
  96.    
  97.    show(head);  
  98.   
  99.    rearrange(head);  
  100.   
  101.    show(head);  
  102.   
  103.    return 0;  
  104. }  


原文:http://blog.csdn.net/SahPah/article/details/38534923
  1.     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章