Citat:
Izraditi program za punjenje, brisanje, pretraživanje i ispis dvostruko povezane liste (liste u kojoj svaki čvor sadrži pokazivač na prethodni i sljedeći čvor). Element liste sadržava cijeli broj i niz od 15 znakova. Lista se oblikuje prema cijelom broju (to je ključ), novi element se unosi u listu tako da su cijeli brojevi sortirani uzlazno, a elementi se brišu i pretražuju po vrijednosti cijelog broja. Funkcija za ispis elemenata u listi mora ispisati obje varijable koje čine element: cijeli broj i niz znakova.
Uspio sam rjesiti zadatak pomocu jednostruko povezane liste:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define BR_B 128
#define V_IME 30
#define V_TELEF 20
/* sablon strukture */
typedef struct carton_st {
char ime[V_IME];
char telefon[V_TELEF];
struct carton_st *slijedeci;
} CARTON;
CARTON p_liste, *pocetak, *tekuci;
static int dodaj_k(void);
static int pronadji_k(void);
static int listaj_k(void);
static int citaj_k(void);
static int pisi_k(void);
CARTON *umetni_cvor(CARTON *);
void greska(char *);
static void prik_zapis(char *, char *);
char odgovor[BR_B + 1];
int main (void)
{
int pk;
tekuci = pocetak = &p_liste;
pocetak->slijedeci = pocetak;
puts("Naredbe za dadoteku imenika:");
puts(" d = dodavanje novog unosa u datoteku");
puts(" p = pronalazenje unosa prema njegovu imenu");
puts(" l = izlistavanje unosa");
puts(" i = izlaz bez cuvanja izmjena\n");
while(1)
{
printf("Naredba (d, p, l ili i): ");
gets(odgovor);
switch (odgovor[0])
{
case 'd':
case 'D':dodaj_k();break;
case 'p':
case 'P':pronadji_k();break;
case 'l':
case 'L':listaj_k();break;
case 'i':
case 'I':return EXIT_SUCCESS;
default:break;
}
}
return EXIT_SUCCESS;
}
static int citaj_k(void)
{
char red[BR_B+1];
int pk = 0;
CARTON *priv;
priv = umetni_cvor(tekuci);
if (priv == NULL)
greska("Nema dovoljno memorije");
tekuci = priv;
strcpy(tekuci->ime, strtok(red, "\t"));
strcpy(tekuci->telefon, strtok(NULL, "\t"));
}
static int dodaj_k(void)
{
int pk = 0, i, pravibroj;
CARTON *priv;
priv = umetni_cvor(tekuci);
if (priv == NULL)
{
fprintf(stderr, "Nema dovoljno memorije");
++pk;
}
else
{
tekuci = priv;
printf("Ime: ");
gets(odgovor);
strcpy(tekuci->ime, odgovor);
printf("Telefon: ");
do
{
scanf("%s", odgovor);
pravibroj = 1;
for(i=0; i<strlen(odgovor); i++)
{
if(isalpha(odgovor[i]))
pravibroj = 0;
}
if(pravibroj == 0)
printf("\nNiste unijeli broj!Ponovite unos: ");
}
while(pravibroj == 0);
strcpy(tekuci->telefon, odgovor);
}
return 0;
}
static int listaj_k(void)
{
int i,j,pk = 0;
CARTON *priv;
priv = pocetak;
if (priv->slijedeci == pocetak) {
puts("Lista je prazna");
++pk;
}
else
while (priv->slijedeci != pocetak) {
priv = priv->slijedeci;
prik_zapis(priv->telefon, priv->ime);
}
return pk;
}
static int pisi_k(void)
{
int pk = 0;
CARTON *priv;
priv = pocetak;
if (priv->slijedeci == pocetak) {
puts("Lista je prazna");
++pk;
}
else
while (priv->slijedeci != pocetak) {
priv = priv->slijedeci;
printf("%s\t%s\n",priv->telefon, priv->ime);
}
return pk;
}
static int pronadji_k(void)
{
int pk = 0;
int pogodaka = 0;
int duz;
char *pz;
CARTON *priv;
priv = pocetak;
if (priv->slijedeci == pocetak) {
puts("Lista je prazna");
return ++pk;
}
printf("Telefon koji trazite: ");
gets(odgovor);
duz = strlen(odgovor);
while(priv->slijedeci != pocetak) {
priv = priv->slijedeci;
pz = priv->telefon;
while (*pz != '\0') {
if (strncmp(pz, odgovor, duz) == 0) {
prik_zapis(priv->telefon, priv->ime);
++pogodaka;
}
++pz;
}
}
if (pogodaka == 0)
puts("Karton nije pronadjen");
return pk;
}
static void prik_zapis (char *zn1, char *zn2)
{
printf ("%-*s\t%-*s\n",V_TELEF, zn1, V_IME, zn2);
}
CARTON *umetni_cvor (CARTON *listp)
{
CARTON *novi;
novi = (CARTON *) malloc (sizeof (CARTON));
if (novi != NULL) {
novi->slijedeci = listp->slijedeci;
listp->slijedeci = novi;
}
return novi;
}
void greska (char *poruka)
{
fprintf (stderr, "GRESKA: %s\n", poruka);
exit (EXIT_FAILURE);
}
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define BR_B 128
#define V_IME 30
#define V_TELEF 20
/* sablon strukture */
typedef struct carton_st {
char ime[V_IME];
char telefon[V_TELEF];
struct carton_st *slijedeci;
} CARTON;
CARTON p_liste, *pocetak, *tekuci;
static int dodaj_k(void);
static int pronadji_k(void);
static int listaj_k(void);
static int citaj_k(void);
static int pisi_k(void);
CARTON *umetni_cvor(CARTON *);
void greska(char *);
static void prik_zapis(char *, char *);
char odgovor[BR_B + 1];
int main (void)
{
int pk;
tekuci = pocetak = &p_liste;
pocetak->slijedeci = pocetak;
puts("Naredbe za dadoteku imenika:");
puts(" d = dodavanje novog unosa u datoteku");
puts(" p = pronalazenje unosa prema njegovu imenu");
puts(" l = izlistavanje unosa");
puts(" i = izlaz bez cuvanja izmjena\n");
while(1)
{
printf("Naredba (d, p, l ili i): ");
gets(odgovor);
switch (odgovor[0])
{
case 'd':
case 'D':dodaj_k();break;
case 'p':
case 'P':pronadji_k();break;
case 'l':
case 'L':listaj_k();break;
case 'i':
case 'I':return EXIT_SUCCESS;
default:break;
}
}
return EXIT_SUCCESS;
}
static int citaj_k(void)
{
char red[BR_B+1];
int pk = 0;
CARTON *priv;
priv = umetni_cvor(tekuci);
if (priv == NULL)
greska("Nema dovoljno memorije");
tekuci = priv;
strcpy(tekuci->ime, strtok(red, "\t"));
strcpy(tekuci->telefon, strtok(NULL, "\t"));
}
static int dodaj_k(void)
{
int pk = 0, i, pravibroj;
CARTON *priv;
priv = umetni_cvor(tekuci);
if (priv == NULL)
{
fprintf(stderr, "Nema dovoljno memorije");
++pk;
}
else
{
tekuci = priv;
printf("Ime: ");
gets(odgovor);
strcpy(tekuci->ime, odgovor);
printf("Telefon: ");
do
{
scanf("%s", odgovor);
pravibroj = 1;
for(i=0; i<strlen(odgovor); i++)
{
if(isalpha(odgovor[i]))
pravibroj = 0;
}
if(pravibroj == 0)
printf("\nNiste unijeli broj!Ponovite unos: ");
}
while(pravibroj == 0);
strcpy(tekuci->telefon, odgovor);
}
return 0;
}
static int listaj_k(void)
{
int i,j,pk = 0;
CARTON *priv;
priv = pocetak;
if (priv->slijedeci == pocetak) {
puts("Lista je prazna");
++pk;
}
else
while (priv->slijedeci != pocetak) {
priv = priv->slijedeci;
prik_zapis(priv->telefon, priv->ime);
}
return pk;
}
static int pisi_k(void)
{
int pk = 0;
CARTON *priv;
priv = pocetak;
if (priv->slijedeci == pocetak) {
puts("Lista je prazna");
++pk;
}
else
while (priv->slijedeci != pocetak) {
priv = priv->slijedeci;
printf("%s\t%s\n",priv->telefon, priv->ime);
}
return pk;
}
static int pronadji_k(void)
{
int pk = 0;
int pogodaka = 0;
int duz;
char *pz;
CARTON *priv;
priv = pocetak;
if (priv->slijedeci == pocetak) {
puts("Lista je prazna");
return ++pk;
}
printf("Telefon koji trazite: ");
gets(odgovor);
duz = strlen(odgovor);
while(priv->slijedeci != pocetak) {
priv = priv->slijedeci;
pz = priv->telefon;
while (*pz != '\0') {
if (strncmp(pz, odgovor, duz) == 0) {
prik_zapis(priv->telefon, priv->ime);
++pogodaka;
}
++pz;
}
}
if (pogodaka == 0)
puts("Karton nije pronadjen");
return pk;
}
static void prik_zapis (char *zn1, char *zn2)
{
printf ("%-*s\t%-*s\n",V_TELEF, zn1, V_IME, zn2);
}
CARTON *umetni_cvor (CARTON *listp)
{
CARTON *novi;
novi = (CARTON *) malloc (sizeof (CARTON));
if (novi != NULL) {
novi->slijedeci = listp->slijedeci;
listp->slijedeci = novi;
}
return novi;
}
void greska (char *poruka)
{
fprintf (stderr, "GRESKA: %s\n", poruka);
exit (EXIT_FAILURE);
}
Zanima moze li se ovaj program preoblikovati u ono sto je zadano zadatkom (i kako)? Ne znam raditi sa dvostruko povezanim listama pa ne znam kako ovo napraviti, i ne znam kako napraviti da se brojevi slazu uzlazno? Molio bih za bilo kakvu pomoc...
Thanks in advance
"We haven't the money, so we've got to think." — Ernest Rutherford
-----------------------------------------------------------------
-[ D ¤ E ¤ U ¤ S ]-
-----------------------------------------------------------------
-[ D ¤ E ¤ U ¤ S ]-