Code:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct nd {
int data;
struct nd *next;
};
typedef struct nd node;
//list sorted in descending order
int add(node **header, int listData)
{
node *newNode, *p, *lastP;
if ((newNode = (node *) malloc(sizeof(node))) == NULL) {
return 0;
}
newNode->data = listData;
//empty list or listData > first node->data
if (*header == NULL || listData >= (*header)->data) {
newNode->next = *header;
*header= newNode;
} else {
//find correct position
for(p=*header; listData < p->data && p->next; lastP=p, p=p->next);
//should we append to the end of a list
if(listData < p->data) {
newNode->next = p->next;
p->next = newNode;
} else {
newNode->next = lastP->next;
lastP->next = newNode;
}
}
return 1;
}
//list printout
void display (node *header)
{
node *p;
int i;
printf("\nPrinting list\n");
if( !header ) {
printf("\tEmpty list!\n");
} else {
for (i=1, p = header; p != NULL; p = p->next, i++) {
printf ("Node: %d -> data = %d\n", i, p->data);
}
}
printf("Done\n\n");
}
//find and return node address
node *find (node *header, int searchData)
{
node *p;
for (p = header; p; p = p->next) {
if (p->data == searchData){
return p;
}
}
return NULL;
}
//delete node
int delete(node **header, int delData)
{
node *p, *pp;
if ( !(p = find(*header, delData)) ) {
return 0;
} else {
if (p == *header) {
//delete from top of the list
pp = (*header)->next;
free (*header);
*header = pp;
} else {
//delete other nodes
// find previous node
for (pp = *header; pp->next != p; pp = pp->next);
// bridge previous and next node
pp->next = p->next;
free (p);
}
return 1;
}
}
int push(node **header, int stackData)
{
node *newNode, *p;
if ((newNode = (node *) malloc(sizeof(node))) == NULL) {
return 0;
}
newNode->data = stackData;
newNode->next = *header;
*header= newNode;
return 1;
}
int pop(node **header, int *data)
{
node *p;
if( !(*header) ){
//empty stack
return 0;
} else {
p = *header;
*data = (*header)->data;
*header = (*header)->next;
free(p);
}
return 1;
}
int main ( void )
{
node *header = NULL, *pnode;
int i, n, data;
//add values to list
printf("Koliko brojeva zelite unijeti u listu: ");
scanf("%d", &n);
printf("\n");
for(i=1; i<=n; i++) {
printf("Unesite %d. broj: ", i);
scanf("%d", &data);
if(!add(&header, data)) {
printf("Nema dovoljno memorije za dodavanje novog elementa u listu!\n");
return -1;
}
}
//display list
display(header);
//search through list
printf("\nUnesite element koji zelite pronaci: ");
scanf("%d", &data);
pnode=find(header, data);
if(pnode) {
printf("\tTrazeni element nalazi se na adresi: %p\n", pnode);
} else {
printf("\tTrazeni element ne postoji u listi\n");
}
//delete value from a list
printf("\nUnesite element koji zelite izbrisati: ");
scanf("%d", &data);
i = delete(&header, data);
if(i) {
printf("\tElement je uspjesno izbrisan\n");
display(header);
} else {
printf("\tTrazeni element ne postoji u listi\n");
}
printf("\nUnesite element koji zelite dodati na stog: ");
scanf("%d", &data);
if( !push(&header, data) ) {
printf("Nema dovoljno memorije za dodavanje novog elementa u listu!\n");
}
//display list
display(header);
while( pop(&header, &data) ) {
printf("Operacijom POP dobivena je vrijednost: %d\n", data);
}
//display list
display(header);
return 0;
}