Wskaźniki i listy, dodawanie.

0

Witam, mam problem z listami i wskaźnikami w C. Struktura listy wyglada tak:

 typedef struct sl {
  char slowo[30];
  struct sl* dalej;
}*  lista;

mam napisać funkcje dodająca wyrazy do listy, tak aby dodany wyraz był na początku listy. Do tej pory naskrobałem coś takiego:

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

typedef struct sl {
  char slowo[MAX_DL_SLOWA];
  struct sl* dalej;
}*  lista;

lista dolacz(char slow[30], lista lis) { // dolacza  slowo  do poczatku listy  lis

 lista pom = (lista)(malloc(sizeof(struct sl)));
 lista nowy = (lista)(malloc(sizeof(struct sl))); //tworze nowa komórke
 pom=lis->dalej; 		//pom trzyma adres który byl wczesniej jako pierszy
 lis->dalej=nowy;		 //nowy ma byc pierszy
 strcpy(nowy->slowo,slow);	 // przepisanie slow do nowej
 nowy->dalej=pom;		//nowa ma adres do poprzedniego drugiego elementu
 free(pom);

 return nowy;
 
}

void druk(lista lis) {
  // drukuje po kolei wszystkie slowa z  lis
while (lis != NULL) {
  printf(" %s\n", lis->slowo);
  lis = lis->dalej;
 }

}

int main () {
  lista lis = NULL;
  dolacz("123",lis);
  lis = dolacz("abc", dolacz("def", dolacz("ghi", lis)));
  druk(lis);

  return 0;
}
 

i błąd ukazuje sie w funkcji dolacz(). treść błędu:
Naruszenie Ochrony Pamięci (core dumped)

Zdaje mi się ze błąd polega na przypisaniu wskaźników . Tylko nie wiem jak go rozwiązać.
Pozdrawiam

1
lista dolacz(char slow[30], lista lis) 
  { 
   lista nowy=(lista)(malloc(sizeof(struct sl)));
   strcpy(nowy->slowo,slow);
   nowy->dalej=lis;
   return nowy; 
  }
0

Dzięki za szybką odpowiedz, działa elegancko :). Problem mam jeszcze z jedna funkcją,

 
lista bez_pierwszego(lista lis) {
  // zwraca liste  lis  z usunietym pierwszym wierszem
  if (lis == NULL) {
printf("NIE MOZNA USUNAC\n"); return 0;
  }
else {
lis->dalej = lis->dalej->dalej;
return lis;
  }
}

Nie wiem czy dobrze rozumuje bo w tej liście wskaźnik dalej pokazuje na następny wiersz. Wiec chce nadpisać wskaźnik tą komenda ,lis->dalej = lis->dalej->dalej;
lecz po wywołaniu: lis = dolacz("123", dolacz("456", dolacz("789", lis))); wyświetla mi tylko 123 789, a miało 456 789.
Może podam cały kod:

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

typedef struct sl {
  char slowo[30];
  struct sl* dalej;
}*  lista;


lista bez_pierwszego(lista lis) {
  // zwraca liste  lis  z usunietym pierwszym slowem
if (lis == NULL) {
printf("\n NIE MOZNA USUNAC\n\n"); return 0;
}
else {
lis->dalej = lis->dalej->dalej;
return lis;
}

}

lista dolacz(char slow[30], lista lis) {
  // dolacza  slowo  do poczatku listy  lis
  
   lista nowy=(lista)(malloc(sizeof(struct sl)));
   strcpy(nowy->slowo,slow);
   nowy->dalej=lis;
   return nowy; 
}

void drukuj(lista lis) {
  // drukuje po kolei wszystkie slowa z  lis
while (lis != NULL) {
  printf(" %s\n", lis->slowo);
  lis = lis->dalej;
 }

}

int main () {
  lista lis = NULL;
  lis = dolacz("123", dolacz("456", dolacz("789", lis)));
  drukuj(lis);
  printf("*************\n");
  bez_pierwszego(lis);
  druk(lis);
  return 0;
}

Jakbyś mógł to napisz mi co takiego miałem źle :).

2
lista bez_pierwszego(lista lis)
  {
   if(lis)
     {
      lista tmp=lis;
      lis=tmp->dalej;
      free(tmp);
     }
   return lis;
  }
0

Dzięki, teraz śmiga aż miło :)

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