Witam!
Mam napisać program wykorzystujący następujące funkcje przetwarzania uporządkowanej niemalejąco listy jednokierunkowej niecyklicznej, zawierającej w polu danych wartości całkowitoliczbowe:
a) wstaw, dodającą do listy (we właściwe miejsce) nowy element, zawierający wprowadzaną z klawiatury liczbę całkowitą; prototyp funkcji jest następujący:
void wstaw(Node **root, int wartosc);
b) usun, usuwającą z listy wszystkie elementy, zawierające wprowadzaną z klawiatury liczbę całkowitą; prototyp funkcji jest następujący:
void usun(Node **root, int wartosc);
c) policz, dodającą na początek listy węzeł, zawierający (w polu danych) liczbę pozostałych elementów listy; prototyp funkcji jest następujący:
void policz(Node **root);
Drugi program z ktorym potrzebuje pomocy:
odwraca zadaną (z klawiatury) jednokierunkową listę niecykliczną, bez wykorzystywania dodatkowej listy lub tablicy; prototyp funkcji jest następujący:
void odwroc(Node **root);
Udało mi sie dojsc do etapu dodawania i usuwania elementow jednak program ma problem z usunieciem pierwszego elementu. Prosiłbym o poprawienie danego kodu oraz o wszelkie wskazówki,naprowadzenia badz gotowe kody do pozostałych czesci zadania.(funkcja policz oraz funkcja odwracajaca elementy). Z gory dziekuje ;)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct Node {
int dane;
struct Node *next;
};
typedef struct Node *NodePtr;
// Prototypy funkcji
void wstaw(Node **root, int wartosc);
void usun(Node **root, int wartosc);
void wyswietl(Node **root);
int main(void)
{
NodePtr poczListy; int Znak;
struct Node *biezacyPtr, *elementPtr;
// Tworzenie listy
poczListy=NULL;
printf("Wprowadz znak: ");
scanf("%d", &Znak);
while (Znak!=-1) { //-1 konczy tworzenie listy
wstaw(&poczListy, Znak);
printf("Wprowadz kolejny znak: ");
scanf("%d", &Znak);
}
printf("Koniec tworzenia listy\n");
wyswietl(&poczListy);
printf("\nPodaj element do usuniecia: ");
scanf("%d", &Znak);
usun(&poczListy, Znak);
//Przeglądanie listy
wyswietl(&poczListy);
system("PAUSE");
return 0;
}
// Definicje funkcji
void wstaw(Node **root, int wartosc) {
struct Node *tmp, *newPtr;
newPtr = (struct Node *)malloc(sizeof(Node));
newPtr->dane = wartosc;
newPtr->next = NULL;
if (!*root) *root=newPtr;
else {
tmp = *root;
if (wartosc <= tmp->dane) {
newPtr->next = *root;
*root = newPtr;
} else {
while ((tmp->next)&&(tmp->next->dane <= wartosc)) tmp = tmp->next;
if (!tmp->next) tmp->next = newPtr;
else {
newPtr->next = tmp->next;
tmp->next = newPtr;
}
}
}
}
void usun(Node **root, int wartosc) {
struct Node *pom, *tmp;
// sprawdzamy czy lista zawiera jakies elementy
if (!*root) printf("Lista jest pusta\n");
else {
tmp = *root;
while (tmp->next) { // przemieszczamy sie po liscie
if ((*root)->dane == wartosc) { // gdy usuwamy pierwszy element
if ((*root)->next) *root = (*root)->next;
free(*root);
} else
if (tmp->next->dane == wartosc) {
pom = tmp->next;
tmp->next = tmp->next->next;
free(pom); // usuniecie elementu
} else if (tmp->next) tmp = tmp->next; // gdy usuniety zostal ostatni element listy
}
printf("Usunieto\n");
}
}
void wyswietl(Node **root) {
struct Node *tmp;
tmp = *root;
printf("\nPrzegladanie listy\n");
while (tmp) {
printf("%d\n",tmp->dane);
tmp=tmp->next;
}
printf("Koniec przegladania listy\n");
}