Tobiahao

Kolokwium2_Lista_Dwukierunkowa_Cykliczna

Jun 7th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.74 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. struct list_node{
  6.     int data;
  7.     struct list_node *previous, *next;
  8. };
  9.  
  10. struct list_node *create_list(int data)
  11. {
  12.     struct list_node *first_node = (struct list_node*)malloc(sizeof(struct list_node));
  13.     if(first_node){
  14.         first_node->data = data;
  15.         first_node->previous = first_node->next = first_node;
  16.     }
  17.     return first_node;
  18. }
  19.  
  20. struct list_node *find_minimum_value_node(struct list_node *list_pointer)
  21. {
  22.     struct list_node *start, *result;
  23.     start = result = list_pointer;
  24.     int minimum = list_pointer->data;
  25.     do{
  26.         if(minimum > list_pointer->data){
  27.             minimum = list_pointer->data;
  28.             result = list_pointer;
  29.         }
  30.         list_pointer = list_pointer->next;
  31.     }while(start != list_pointer);
  32.     return result;
  33. }
  34.  
  35. struct list_node *find_next_node(struct list_node *list_pointer, int data)
  36. {
  37.     list_pointer = find_minimum_value_node(list_pointer);
  38.     struct list_node *start = list_pointer;
  39.     do{
  40.         if(list_pointer->data > data)
  41.             break;
  42.         list_pointer = list_pointer->next;
  43.     }while(start != list_pointer);
  44.     return list_pointer;
  45. }
  46.  
  47. void add_node(struct list_node *list_pointer, int data)
  48. {
  49.     if(list_pointer){
  50.         struct list_node *new_node = (struct list_node*)malloc(sizeof(struct list_node));
  51.         if(new_node){
  52.             new_node->data = data;
  53.             list_pointer = find_next_node(list_pointer, data);
  54.            
  55.             new_node->next = list_pointer;
  56.             new_node->previous = list_pointer->previous;
  57.             list_pointer->previous->next = new_node;
  58.             list_pointer->previous = new_node;
  59.         }
  60.     }
  61. }
  62.  
  63. struct list_node *delete_node(struct list_node *list_pointer, int data)
  64. {
  65.     if(list_pointer){
  66.         list_pointer = find_next_node(list_pointer, data);
  67.         list_pointer = list_pointer->previous;
  68.         if(list_pointer->data == data){
  69.             if(list_pointer == list_pointer->next){
  70.                 free(list_pointer);
  71.                 return NULL;
  72.             }
  73.             struct list_node *next_node = list_pointer->next;
  74.             list_pointer->previous->next = list_pointer->next;
  75.             list_pointer->next->previous = list_pointer->previous;
  76.             free(list_pointer);
  77.             list_pointer = next_node;
  78.         }
  79.         else
  80.             fprintf(stderr, "Brak elementu w liscie!\n");
  81.     }
  82.     return list_pointer;
  83. }
  84.  
  85. void print_list(struct list_node *list_pointer)
  86. {
  87.     if(list_pointer){
  88.         list_pointer = find_minimum_value_node(list_pointer);
  89.         struct list_node *start = list_pointer;
  90.         do{
  91.             printf("%d ", list_pointer->data);
  92.             list_pointer = list_pointer->next;
  93.         }while(start != list_pointer);
  94.     }
  95.     else
  96.         fprintf(stderr, "Lista jest pusta!\n");
  97.     printf("\n");
  98. }
  99.  
  100. void remove_list(struct list_node **list_pointer)
  101. {
  102.     if(*list_pointer){
  103.         struct list_node *start = *list_pointer;
  104.         do{
  105.             struct list_node *next_node = (*list_pointer)->next;
  106.             free(*list_pointer);
  107.             *list_pointer = next_node;
  108.         }while(start != (*list_pointer));
  109.         *list_pointer = NULL;
  110.     }
  111.     else
  112.         fprintf(stderr, "Lista jest pusta!\n");
  113. }
  114.  
  115. int main(void)
  116. {
  117.     srand(time(NULL));
  118.    
  119.     struct list_node *list_pointer = (struct list_node*)malloc(sizeof(struct list_node));
  120.     list_pointer = create_list(10);
  121.    
  122.     int i;
  123.     for(i = 0; i < 10; i++)
  124.         add_node(list_pointer, rand()%10);
  125.     print_list(list_pointer);
  126.    
  127.     list_pointer = delete_node(list_pointer, 10);
  128.     print_list(list_pointer);
  129.    
  130.     remove_list(&list_pointer);
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment