fork download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. typedef struct Item
  5. {
  6. int height;
  7. struct Item* prev;
  8. struct Item* next;
  9. } Item;
  10.  
  11. typedef struct
  12. {
  13. int size;
  14. Item* first;
  15. Item* last;
  16. } List;
  17.  
  18. static void insert(List *list, int height)
  19. {
  20. printf("* ===\n");
  21.  
  22. Item *newItem = (Item*)malloc(sizeof(Item));
  23. newItem->height = height;
  24.  
  25. if (list->size == 0)
  26. {
  27. printf("* inserindo elemento %d em lista vazia\n", height);
  28. // lista vazia
  29. list->first = newItem;
  30. list->last = newItem;
  31. newItem->prev = newItem;
  32. newItem->next = newItem;
  33. list->size = 1;
  34. return;
  35. }
  36.  
  37. if (height > list->first->height)
  38. {
  39. printf("* inserindo elemento %d antes do primeiro\n", height);
  40. list->first->prev = newItem;
  41. list->last->next = newItem;
  42. newItem->prev = list->last;
  43. newItem->next = list->first;
  44. list->first = newItem;
  45. list->size++;
  46. return;
  47. }
  48.  
  49. if (height < list->last->height)
  50. {
  51. printf("* inserindo elemento %d depois do ultimo\n", height);
  52. list->last->next = newItem;
  53. list->first->prev = newItem;
  54. newItem->prev = list->last;
  55. newItem->next = list->first;
  56. list->last = newItem;
  57. list->size++;
  58. return;
  59. }
  60.  
  61. printf("* inserindo elemento %d intermediario\n", height);
  62. Item* item = list->first;
  63. for (int i = 0; i < list->size; i++)
  64. {
  65. if (item->height < height)
  66. break;
  67. item = item->next;
  68. }
  69.  
  70. item->prev->next = newItem;
  71.  
  72. newItem->prev = item->prev;
  73. newItem->next = item;
  74.  
  75. item->prev = newItem;
  76.  
  77. list->size++;
  78. }
  79.  
  80. static void print(List* list)
  81. {
  82. printf("* ---\n");
  83. printf("* tamanho da lista: %d\n", list->size);
  84. Item* item = list->first;
  85. for (int i = 0; i < list->size; i++)
  86. {
  87. printf("* list[%d] = %d\n", i, item->height);
  88. item = item->next;
  89. }
  90. }
  91.  
  92.  
  93. int main(void)
  94. {
  95. List list = { 0 };
  96. print(&list);
  97.  
  98. insert(&list, 7); // primeiro elemento
  99. print(&list);
  100.  
  101. insert(&list, 2); // antes do primeiro elemento
  102. print(&list);
  103.  
  104. insert(&list, 13); // depois do ultimo elemento
  105. print(&list);
  106.  
  107. insert(&list, 9); // elemento intermediario
  108. print(&list);
  109. }
  110.  
Success #stdin #stdout 0s 2292KB
stdin
Standard input is empty
stdout
* ---
* tamanho da lista: 0
* ===
* inserindo elemento 7 em lista vazia
* ---
* tamanho da lista: 1
* list[0] = 7
* ===
* inserindo elemento 2 depois do ultimo
* ---
* tamanho da lista: 2
* list[0] = 7
* list[1] = 2
* ===
* inserindo elemento 13 antes do primeiro
* ---
* tamanho da lista: 3
* list[0] = 13
* list[1] = 7
* list[2] = 2
* ===
* inserindo elemento 9 intermediario
* ---
* tamanho da lista: 4
* list[0] = 13
* list[1] = 9
* list[2] = 7
* list[3] = 2