fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // struktura dla listy jednokierunkowej
  5. struct ListaInt {
  6. int liczba;
  7. struct ListaInt* next;
  8. } Lista;
  9.  
  10. int main() {
  11. struct ListaInt *head, *nowy, *tmp = NULL;
  12.  
  13. int liczba, i, deleted = 0;
  14. printf("Podaj liczbe: ");
  15. scanf("%d", &liczba);
  16. // tworzenie głowy
  17. head = malloc(sizeof(Lista));
  18. head->liczba = liczba;
  19. head->next = NULL;
  20. tmp = head;
  21.  
  22. // tworzenie ogona
  23. for (i = 0; i<3; i++){
  24. printf("Podaj liczbe: ");
  25. scanf("%d", &liczba);
  26. // tworzenie miejsca w pamieci dla obiektu
  27. nowy = malloc(sizeof(Lista));
  28. // wpisywanie wartosci w pola struktury
  29. nowy->liczba = liczba;
  30. nowy->next = NULL;
  31. // tmp wskazuje na "jeden wczesniej" dzieki temu poprzedni element listy moze wskazywac na juz istniejacy element
  32. tmp->next = nowy;
  33. tmp = nowy;
  34. }
  35.  
  36. //tworzenie nowej glowy
  37. printf("Podaj liczbe: ");
  38. scanf("%d", &liczba);
  39. // tworzenie miejsca w pamieci dla obiektu
  40. nowy = malloc(sizeof(Lista));
  41. // wpisywanie wartosci w pola struktury
  42. nowy->liczba = liczba;
  43. // wskazujemy na stara glowe
  44. nowy->next = head;
  45. head = nowy;
  46.  
  47. // usuwanie elementu o konkretnej liczbie
  48. printf("Podaj liczbe do skasowania: ");
  49. scanf("%d", &liczba);
  50. // aby przeszukac liste należy wskaźnik tmp ustawić na pierwszy element
  51. tmp = head;
  52. // usowanie glowy
  53. if (head->liczba == liczba)
  54. {
  55. head = head->next;
  56. free(tmp);
  57. deleted = 1;
  58. }
  59. //w przeciwnym razie przeszukujemy liste
  60. //tworze pomocniczy element do kasowania
  61. struct ListaInt *aktualny = NULL, *poprzedni = NULL;
  62. while (!deleted&&tmp->next != NULL){
  63. if (tmp->next->liczba == liczba)
  64. {
  65. aktualny = tmp -> next;
  66. tmp->next = tmp -> next -> next;
  67. free(aktualny);
  68. deleted = 1;
  69. }
  70. poprzedni = tmp;
  71. tmp = tmp->next;
  72. }
  73. if (!deleted&&tmp->liczba == liczba)
  74. {
  75. poprzedni->next = NULL;
  76. free(tmp);
  77. }
  78.  
  79.  
  80.  
  81. // aby wyswietlic listę należy wskaźnik tmp ustawić na pierwszy element
  82. tmp = head;
  83. do{
  84. printf("liczba to: %d\n", tmp->liczba);
  85. tmp = tmp->next;
  86. } while (tmp != NULL);
  87.  
  88. // ewentualnie mozna for
  89. tmp = head;
  90. /*for (i = 0; i<5; i++){
  91. printf("liczba to: %d\n", tmp->liczba);
  92. tmp = tmp->next;
  93. } */
  94. system("pause");
  95. return 0;
  96. }
  97.  
Success #stdin #stdout #stderr 0s 4552KB
stdin
1
2
3
4
5
2
stdout
Podaj liczbe: Podaj liczbe: Podaj liczbe: Podaj liczbe: Podaj liczbe: Podaj liczbe do skasowania: liczba to: 5
liczba to: 1
liczba to: 3
liczba to: 4
stderr
sh: 1: pause: not found