Budowanie listy wg niemalejących wartości klucza.

0

Ludziska, help! Miałem na kolokwium ostatniej szansy do napisania w C deklarację typu struktury przechowującej zmienną double(klucz) i wskazanie na napis(lista jednokierunkowa). Do tego funkcja budująca listę wg niemalejących kluczy. Jej argumenty wywołania to wskazanie na wskaźnik wskazujący na początek listy, double a i napis dowolnej długości. Oto moje wypociny:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct struktura
{
    double klucz;
    char *napis;
    struct struktura *next;
}struktura;

struktura **head;


int wstaw (**head,double a, char *napis)
{
    struktura *wstaw, *akt, *pop;
    if((wstaw=malloc(sizeof(struktura)))==NULL)
        return 1;
    wstaw->klucz = a;
    if((wstaw->napis=malloc(sizeof(strlen(napis)+1)))==NULL)
    {
        free(wstaw);
        return 1;
    }
    strcpy(wstaw->napis,napis);

    if((*head)==NULL || head==NULL || (*head)->klucz>=a)
    {
        wstaw->next=*head;
        *head=wstaw;
        return 0;
    }
    pop=*head;
    akt=pop->next;
        while(akt!=NULL)
        {
            if(akt->klucz>=a)
                break;
            pop=akt;
            akt=akt->next;
        }
        pop->next=wstaw;
        return 0;
}

okazało się, że jednak nie jest idealnie i muszę jutro złożyć wyjaśnienia, teraz widzę, że to nieidealnie to brak typu wskaźnika w argumentach wywołania funkcji. Nic innego nie widzę. Czy mam rację?

0

Właściwie to ta deklaracja head jest niepotrzebna, nie miałem jej pisać, strcpy + malloc - tak wymaga wykładowca, za dużo kodu? To jest pierwszy semestr na pierwszym roku i pierwsza styczność z C, tak te funkcje są na tym poziomie pisane. Mógłbyś rozwinąć nullowanie head? bo nie bardzo wiem, w którym momencie miałoby to się dziać.

0
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct struktura
  {
   double klucz;
   char *napis;
   struct struktura *next;
  } struktura;

struktura *head=NULL;

int wstaw(struktura **head,double a, char *napis)
  {
   struktura *curr=NULL;
   while((*head)&&((*head)->klucz<a)) head=&((*head)->next);
   if((curr=malloc(sizeof(struktura)))==NULL) return 1;
   if((curr->napis=strdup(napis))==NULL) { free(curr); return 1; }
   curr->klucz=a;
   curr->next=*head;
   *head=curr;
   return 0;
  }
  
int main()
  {
   struktura *i;
   wstaw(&head,5.5,"five");
   wstaw(&head,2.2,"two");
   wstaw(&head,3.3,"three");
   wstaw(&head,4.4,"four");
   wstaw(&head,1.1,"one");
   for(i=head;i;i=i->next) printf("%3.1f %s\n",i->klucz,i->napis);
   return 0;
  }
0

Nie chciałbym, żeby to źle zabrzmiało, ale to moja pierwsza styczność z programowaniem i dodatkowo zaczynanie od C jest dość dużym szokiem, dlatego Twoje rozwiązanie jak na razie jest nie dla mnie. Moje rozwiązanie jest łopatologiczne, jest ze studiów, a na studiach chodzi o to żeby zaliczyć tak jak się podoba wykładowcy - niestety. Dodatkowo koleś programował jak jeszcze C nie było na świecie i najchętniej by usunął C 99 i inne nowe wynalazki. Najlepiej to jakbyśmy w ogóle nie mieli kompilatora, tylko taśmy perforowane :)

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