Advertisement
Tobiahao

Kolokwium_Lista

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