Działanie na zbiorach rozłącznych.

0

Mam do zrobienia takie zadanie:
Zaimplementowac jedna z ponizszch reprezentacji zbiorow rozlacznych,
tzn. operacje MakeSet, FindSet, Union.

(LW) reprezentacja listowa z wywazaniem

Wykonac nastepujacy program testowy:

zbudowac przy pomocy MakeSet() tablice 12 zbiorow jednoelementowych
zawierajacych elementy 0, ... ,10
czyli Z[0] = MakeSet(0);
Z[1] = MakeSet(1);
....

Wykonac operacje Union:
Union(FindSet(Z[0]),FindSet([2]))
Union(FindSet(Z[1]),FindSet([2]))
Union(FindSet(Z[3]),FindSet([4]))
Union(FindSet(Z[5]),FindSet([6]))
Union(FindSet(Z[7]),FindSet([8]))
Union(FindSet(Z[9]),FindSet([10]))
Union(FindSet(Z[1]),FindSet([4]))
Union(FindSet(Z[2]),FindSet([5]))
Union(FindSet(Z[8]),FindSet([1]))

Wydrukowac informacje pozwalajace odtworzyc, jak wyglada
reprezentacja tych zbiorow po wykonanych polaczeniach.

I udało mi się w miarę szybko napisać ten kod:

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

#define NIL NULL
typedef struct node {
int key;
struct node *next;
struct node *head;
struct node *last;
int length;
} t_node;

t_node* make_set( int k) {
t_node *x;
x->key=k;
x->next=NIL;
x->head=x;
x->last=x;
x->length=1;
return x;
}

t_node* FindSet(t_node* x) {
return x->head;
}

void Union(t_node* x, t_node* y) {
t_node *helper;
if(y->length > x->length)
{
helper=x;
x=y;
y=helper;
}
x->length = x->length + y->length;
x->last->next=y;
x->last=y->last;
while(y!=NIL)
{
y->head=x;
y=y->next;
}}


int main()
{
t_node *Z[12];
int i;
int z=0;
int randomowa;
for(i=0; i<12; i++)
{
if(z==10)
{z=0;}

Z[i]=make_set(z);
z++;
}
Union(FindSet(Z[0]),FindSet(Z[2]));
/*Union(FindSet(Z[1]),FindSet(Z[2]));
Union(FindSet(Z[3]),FindSet(Z[4]));
Union(FindSet(Z[5]),FindSet(Z[6]));
Union(FindSet(Z[7]),FindSet(Z[8]));
Union(FindSet(Z[9]),FindSet(Z[10]));
Union(FindSet(Z[1]),FindSet(Z[4]));
Union(FindSet(Z[2]),FindSet(Z[5]));
Union(FindSet(Z[8]),FindSet(Z[1]));
//printf("%c", Z[0].next->key);
*/
printf("udalo sie");}

Czy ktoś mógłby powiedzieć mi dlaczego wywala mi naruszenie ochrony pamięci?

0

Odpowiedź jest prosta: bo nie znasz podstaw języka w którym piszesz :) Korzystasz tutaj ze wskaźników a w kodzie nie widzę ani jednego new(). Co to ma być:

t_node *x;
 x->key=k;
 x->next=NIL;
 x->head=x;
 x->last=x;
 x->length=1;

?
Tworzysz wskaźnik, który pokazuje cholera-wie-gdzie, a potem wpisujesz coś do tej pamięci. Bardzo nie ładnie pisać po nie swojej pamięci!

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