Skocz do zawartości


Zdjęcie

[C]Listy, struktury, pliki


  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 16 12 2009 - 21:09

Mam taki problem, którego w ogóle nie mogę zidentyfikować w kodzie. Zadanie polegało na tym, aby:
1. Wczytać dane kilku osób (imię i nazwisko), a następnie zapisać je do pliku
2. Otworzyć ten plik, pobrać dane i zapisać je do listy w kolejności rosnącej (sortowanie względem nazwiska). tylko należy te dane od razu w odpowiednim miejscu do listy wstawić.
3. Usunąć listę, poczynając od pierwszego elementu. Za każdym razem lista ma być wyświetlona.
W Visual Studio 2008 program się wykonywał, kompilator żadnego błędu nie wykrył. Natomiast podczas wykonywania pojawiał się jakiś dziwny błąd. Program działał tak, że wstawiał elementy do listy, ale czasami pokazywał jakiś element dwa razy (przy jednych danych element się powtarzał na początku, przy innych na końcu, jeszcze przy innych w środku - nie zdążyłam zauważyć zależności, kiedy co powtarza). Zaraz potem pojawiało się okienko (chyba z wykrzyknikiem w białym/niebieskim trójkącie, nie pamiętam). Taki problem miałam nie tylko ja, ale też i inne osoby, które taki program utworzyły.
W Dev-C++ 4.9.9.2 program w ogóle nie chce się uruchomić, Windows od razu pokazuje, że program przestał działać.
Listing wygląda tak:
#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <string.h>//#define N 5;struct osoba{ char imie[20];  char nazwisko[25];};struct lista{ char im[20];  char naz[25];  struct lista *next;};struct lista *wstaw(struct lista *head, struct osoba os){ struct lista *nowy, *temp;    nowy=(struct lista *)malloc(sizeof(struct lista));  strcpy(nowy->im,os.imie);  strcpy(nowy->naz,os.nazwisko);  nowy->next=NULL;  if(head==NULL) head=nowy;  else  {     if (strcmp(head->naz, nowy->naz)>0)	{ nowy->next=head;	  head=nowy;	}	else	{temp=head;	while(temp->next!=NULL&& strcmp(temp->next->naz,nowy->naz)<0)	 temp=temp->next;	  nowy->next=temp->next;	  temp->next=nowy;   	}  }  return (head);}void pokaz(struct lista *head){ while(head->next!=NULL)  { printf("%s\n", head->naz);    printf("%s\n\n", head->im);	head=head->next;  }}struct lista *usun(struct lista *head){ struct lista *temp;  if(head!=NULL) temp=head;  if(head->next==NULL)  { free(head);    head=NULL;	return NULL;  }  head=head->next;  free(temp);  return (head);}int main(){ int i, j;  struct osoba os;  struct lista *head=NULL;  FILE *fp;      if((fp=fopen("dane.txt", "w"))==NULL)  { printf("blad. exit");    exit(1);  }   for(i=0; i<5; i++)  { for(j=0; j<20; j++) os.imie[j]='\0';    for(j=0; j<25; j++) os.nazwisko[j]='\0';	printf("podaj imie: ");	gets(os.imie);	printf("podaj nazwisko: ");	gets(os.nazwisko);	fwrite(&os, sizeof(struct osoba), 1, fp);  }  if((fp=fopen("dane.txt", "r"))==NULL)  { printf("blad. exit");    exit(1);  }  rewind(fp);   while(!feof(fp))  { fread(&os, sizeof(struct osoba), 1, fp);    head=wstaw(head, os);  }  pokaz(head);  /* koniec tworzenia listy */  while(head!=NULL)  { head=usun(head);    pokaz(head);	printf("------------------------------\n\n");  }  fclose(fp);  /* koniec odczytu pliku */  system("pause");  return 0;}
W VS 2008 main jest jako void main(), bez return 0 na końcu programu. Listing jest poprawiony, aby działał pod Dev'a (czyli jest int main())

  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych