Zadanie z kolokwium (tablice i listy)

0

Witam dziś na kolokwium miałem takie zadanie i nie wiem jak to ugryźć. Zadanie w języku C.

Zadaniem programu jest wykonanie operacji na liście jednokierunkowej przechowującej informacje o
samochodach. Lista reprezentowana jest przez zmienną wskaźnikową do pierwszego elementu listy
(head).
Struktura węzła:

typedef struct Element{
char marka[LIMIT];
char model[LIMIT];
int cena;
struct Element *next;
}Element;

Napisz funkcje:
1pkt
void dodajSamochod(Element **head, char *marka, char *model, int cena) dodającą
do listy nowy węzeł z samochodem. Nowy węzeł dodawany jest na początek listy.

1pkt
void wypisz(Element **head) wypisującą wszystkie elementy listy jeden pod drugim np.:
Renault Laguna 1 - 5700
Audi A6 - 36000

2pkt
void konwersja(Element **head, int T[]) wypełniającą jednowymiarową tablicę cenami
samochodów.

1pkt
void sortuj(int T[]) która posortuje ceny w tablicy od największej do najmniejszej.

1pkt
void kupujemy(Element **head), której wywołanie spowoduje „kupno” pierwszego samochodu
na liście, czyli usunięcie pierwszego elementu listy.

**
Fragment programu:**

#include <stdio.h>
//#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define LIMIT 100
#define ILOSC_SAMOCHODOW 30

// Typ elementów listy
//--------------------
typedef struct Element{ 
	char marka[LIMIT];
	char model[LIMIT];
	int cena; 
	struct Element *next; 
}Element; 

//Prototypy funkcji
void dodajSamochod(Element **head, char *marka, char *model, int cena);
void wypisz(Element **head);
void konwersja(Element **head, int T[]);
void sortuj(int T[]);
void kupujemy(Element **head);

int main(void)
{
	int i;
	int T[ILOSC_SAMOCHODOW];
	Element *head = NULL;

	char *samochody[][2] = {{"Audi", "A4"},{"Renault", "Laguna 1"},{"Audi", "A6"},{"Fiat", "Panda"},{"Opel", "Corsa"},{"Hyundai", "i30"},
							{"BMW", "E60"},{"Peugeot", "508"},{"Honda", "Civic"},{"Volkswagen", "Passat"},{"Nissan", "Almera"},{"Peugeot", "Boxer"},
							{"Polonez", "Caro"},{"Saab", "900"},{"Jaguar", "XF"},{"Kia", "Ceed"},{"Renault", "Scenic"},{"Lancia", "Thema"},
							{"Renault", "Thalia"},{"Lancia", "Delta"},{"Audi", "A4"},{"Volkswagen", "Sharan"},{"Audi", "S4"},{"Peugeot", "206"},
							{"Mazda", "CX7"},{"Peugeot", "407"},{"Honda", "CRX"},{"Toyota", "Corolla"},{"Chrysler", "Voyager"},{"Toyota", "Avensis"}};

	srand(time(0));

	//Dodawanie samochodow do listy
	for(i=0;i<ILOSC_SAMOCHODOW;i++)
	{
		dodajSamochod(&head, samochody[i][0], samochody[i][1], 1000+rand()%50000);
	}

	//wypisanie listy
	wypisz(&head);

	//utworzenie jednowymiarowej tablicy dynamicznej z cenami
	konwersja(&head, T);

	//wypisanie tablicy
	printf("\n\n");
	for(i=0;i<ILOSC_SAMOCHODOW;i++) printf("%d\n",T[i]);

	//sortowanie cen
	sortuj(T);

	//wypisanie tablicy
	printf("\n\n");
	for(i=0;i<ILOSC_SAMOCHODOW;i++) printf("%d\n",T[i]);

	//kupno samochodu
	kupujemy(&head);
	//wypisanie listy
	printf("\n\n");
	wypisz(&head);

	printf("\n");
	system("pause");
	return 0;
}



0

Funkcja dodajSamochod probowalem w ten sposob. Ale nie działa to do konca.

void dodajSamochod(Element  **head, char *marka, char *model, int cena)
{
    Samochod *nowy = (Samochod *)malloc(sizeof(Samochod));
    strncpy(nowy->marka, marka, sizeof(nowy->marka));
    strncpy(nowy->model, model, sizeof(nowy->model));
    nowy->cena=cena;
    Element *nowe = (Element *)malloc(sizeof(Element));
    nowe->pojazd = nowy;
    nowe->next=head;
    nowe->prev=NULL;
    head=&nowe;
}
0

In function 'dodajSamochod':

[Error] unknown type name 'Samochod'
[Error] 'Samochod' undeclared (first use in this function)
[Note] each undeclared identifier is reported only once for each function it appears in
[Error] expected expression before ')' token
[Error] request for member 'marka' in something not a structure or union
[Error] request for member 'marka' in something not a structure or union
[Error] request for member 'model' in something not a structure or union
[Error] request for member 'model' in something not a structure or union
[Error] request for member 'cena' in something not a structure or union
[Error] 'Element' has no member named 'pojazd'
[Warning] assignment from incompatible pointer type
[Error] 'Element' has no member named 'prev'
1
  1. Kompilator wyraźnie Ci podpowiada - nie zdefiniowałeś typu Samochod.
  2. Napisałeś, że lista jest jednokierunkowa, więc skąd u Ciebie odwołanie do nowe->prev?

Wszystko wskazuje na to, że przekopiowałeś skądś kod i zupełnie nie wiesz, co on robi.

0

Nic nie przekopiowałem, fragment programu miałem dołączony do zadania. Celem jest napisanie funkcji aby cały program dział jak w poleceniu. Napisałem takie funkcje:

void dodajSamochod(Element  **head, char *marka, char *model, int cena)
{
    Samochod *nowy = (Samochod *)malloc(sizeof(Samochod));
    strncpy(nowy->marka, marka, sizeof(nowy->marka));
    strncpy(nowy->model, model, sizeof(nowy->model));
    nowy->cena=cena;
    Element *nowe = (Element *)malloc(sizeof(Element));
    nowe->pojazd = nowy;
    nowe->next=head;

    head=&nowe;
}

// void wypisz(Element **head);

void wypisz(Element **head)
{
    Element *pointer = head;
    while (pointer)
    {
        printf("%c %c %i",pointer->pojazd->marka, pointer->pojazd->model, pointer->pojazd->cena);
        pointer=pointer->next;
    }
}

// void konwersja(Element **head, int T[]);

void konwersja(Element **head, int T[])
{
    Element *pointer = head;
    int i=0;
    while(pointer)
    {
        T[i++]=pointer->pojazd->model;
        pointer=pointer->next;
    }
}

// void sortuj(int T[]);

void sortuj(int T[])
{
    int i=0, j=0;
    int tmp;
    for (i=0; i<ILOSC_SAMOCHODOW; i++)
    {
        for (j=0; j<ILOSC_SAMOCHODOW; j++)
        {
            if (T[j]>T[i])
            {
                tmp=T[i];
                T[i]=T[j];
                T[j]=tmp;
            }
        }
    }
}

// void kupujemy(Element **head);

void kupujemy(Element **head)
{
    Element *pointer = head;
    while (head)
    {
        pointer=pointer->next;
        free (head);
        head=pointer;
    }
    head=NULL;
}

I mam błędy:

C:\Users\2\Pictures\Nowy folder\main.c	In function 'dodajSamochod':
[Error] unknown type name 'Samochod'
[Error] 'Samochod' undeclared (first use in this function)
[Note] each undeclared identifier is reported only once for each function it appears in
2[Error] expected expression before ')' token
[Error] request for member 'marka' in something not a structure or union
[Error] request for member 'marka' in something not a structure or union
[Error] request for member 'model' in something not a structure or union
[Error] request for member 'model' in something not a structure or union
[Error] request for member 'cena' in something not a structure or union
[Error] 'Element' has no member named 'pojazd'
[Warning] assignment from incompatible pointer type
In function 'wypisz':
[Warning] initialization from incompatible pointer type
[Error] 'Element' has no member named 'pojazd'
[Error] 'Element' has no member named 'pojazd'
[Error] 'Element' has no member named 'pojazd'
In function 'konwersja':
[Warning] initialization from incompatible pointer type
[Error] 'Element' has no member named 'pojazd'
In function 'kupujemy':
[Warning] initialization from incompatible pointer type
[Warning] assignment from incompatible pointer type
recipe for target 'main.o' failed
0

Nie masz zadeklarowanej struktury Samochody.
Najpierw deklarujesz strukturę Element:

 typedef struct Element{ 
    char marka[LIMIT];
    char model[LIMIT];
    int cena; 
    struct Element *next; 
}Element; 

A potem tworzysz element tej struktury:

     Element *nowe = (Element *)malloc(sizeof(Element));
    nowe->pojazd = nowy;
    nowe->next=head;

Moim zdaniem pomyliłeś też nazwy struktur.

1

Lekcja na dziś:

sizeof zwraca wielkość zmiennej, a ty musisz przy kopiowaniu podać ilość bajtów do przekopiowania czyli potrzebujesz funkcji strlen.
wielkość elementów masz stałą i nie trzeba głębokim zarządzaniem zawracać sobie głowy.

Nie masz nic zdefiniowane jako Samochód. W ogóle i tak to nie jest potrzebne.

Nie ma sprawdzania czy nie przepełniono bufora i czy udało się zaalokować pamieć.

 void dodajSamochod(Element  *head, char *marka, char *model, int cena)
{
    Element *nowy = (Element *)malloc(sizeof(Element));
    strncpy(nowy->marka, marka, strlen(marka));
    strncpy(nowy->model, model, strlen(model));
    nowy->cena=cena;
    nowy->next=head;
    head=nowy;
}
0

Nie sprawdzałem Czy się kompiluje ale może Cię naprowadzi jak można to ugryźć. (Nie czytałem specjalnie Twojego zadania tylko zasugerowałem się co robi funkcja i na ślepo pewne rzeczy przyjąłem, bo nie planowałem sie temu specjalnie poświęcać ).

https://paste.fedoraproject.org/536237/

teoretycznie powinno byc strncpy z LIMIT-1
i na koniec umieszczone nul ;-)

Pzdr.

0

Dzięki Biały Rycerz, mam jeszcze takie błędy:

In function 'dodajSamochod':
[Warning] assignment from incompatible pointer type
[Warning] assignment from incompatible pointer type
In function 'wypisz':
[Warning] initialization from incompatible pointer type
[Error] 'Element' has no member named 'pojazd'
[Error] 'Element' has no member named 'pojazd'
[Error] 'Element' has no member named 'pojazd'
In function 'konwersja':
[Warning] initialization from incompatible pointer type
[Error] 'Element' has no member named 'pojazd'
In function 'kupujemy':
[Warning] initialization from incompatible pointer type
[Warning] assignment from incompatible pointer type
recipe for target 'main.o' failed
0

Na początku kodu zadeklarowałeś, że masz

 typedef struct Element{ 
    char marka[LIMIT];
    char model[LIMIT];
    int cena; 
    struct Element *next; 
}Element; 

Element to twój samochód na to wychodzi.

Head to lista jednokierunkowa, która wskazuje na pierwszy element.
Każdy następny to head->next;
A zawartość to head->model, head->cena.

Jeśli head->next nie jest równy 0 to znaczy, że jest następny element na liście, a jak się trafi 0 to lista się kończy.
możesz utworzyć wskaźnik na element tymczasowy Element *tmp i przypisywać do niego poszczególne elementy w pętli.
a przed pętlą zrobić tmp = head
W pętli tmp=tmp->next; następny element i wypisać tmp->cena tmp->model itp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1