Siema, napisałem już cały kod tablicy haszowej, której elementy mają ciągnąć za sobą łańcuszek jakichś liczb. Niestety przy próbie dodania elementu program pada. Domyślam się, że jest problem z jakimś wskaźnikiem, pewnie mam złą wizję zadania...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
struct element
{
unsigned int value;
struct element *next;
};
struct element *tablica[100];
void dopisz();
void usun();
void show();
int add(int value);
int del(int value);
int main()
{
int isEnd = FALSE;
char answer[100];
while(!isEnd)
{
printf("\n\t\tMENU\n");
printf("[0] - zakonczenie programu\n");
printf("[1] - dopisanie wyrazu\n");
printf("[2] - usuniecie wyrazu\n");
printf("[3] - wyswietlenie zawartosci listy\n");
scanf("%s", answer);
switch(answer[0])
{
case '0':
printf("Zakonczenie!\n");
isEnd=TRUE;
break;
case '1':
dopisz();
break;
case '2':
usun();
break;
case '3':
show();
break;
default:
printf("Bledny wybor...\n");
}
}
return 0;
}
void dopisz()
{
int value;
printf("Wartosc: ");
scanf("%d", &value);
if(add(value))
printf("\nDodano\n");
else
printf("\nPodany element juz istnieje!\n");
}
void usun()
{
int value;
printf("\nJaki element usunac?\t");
scanf("%d", &value);
if(del(value))
printf("\nUsunieto.\n");
else
printf("\nPodany wyraz nie istnieje.\n");
}
void show()
{
int i;
struct element *temp;
for(i=0; i<100; i++)
{
if(tablica[i]->next == NULL)
continue;
else
{
printf("#%d:\t", i);
for(temp=tablica[i]->next; temp!=NULL; temp=temp->next)
{
printf("%d\t", temp->value);
}
putchar('\n');
}
}
}
int add(int value)
{
int index = value%100;
struct element *curr, *tmp, *newItem;
newItem = (struct element*)malloc(sizeof(struct element));
if(newItem == NULL)
{
printf("\nBrak pamieci!\n");
return FALSE;
}
newItem->value = value;
newItem->next = NULL;
if(tablica[index]->next == NULL)
{
tablica[index]->next = newItem;
return TRUE;
}
for(curr=tablica[index]; curr!=NULL; curr=curr->next)
{
if(curr->value == value)
return FALSE;
}
tmp = tablica[index]->next;
tablica[index]->next = newItem;
newItem->next = tmp;
return TRUE;
}
int del(int value)
{
int index = value%100;
struct element *curr, *prev;
if(tablica[index] == NULL)
{
return FALSE;
}
for(curr=tablica[index]; curr!=NULL; curr=curr->next)
{
if(curr->value == value)
{
prev->next = curr->next;
free(curr);
return TRUE;
}
prev = curr;
}
return FALSE;
}