Aide pr l'algorithme de hachage

Résolu/Fermé
sfrsky Messages postés 125 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 20 novembre 2014 - 23 févr. 2008 à 03:40
sfrsky Messages postés 125 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 20 novembre 2014 - 11 mars 2008 à 20:16
Bonjour,
j'ai un petit probléme avec le programme de hachage par chainage ouvert, c'est a dire que si la table dois contenir 5 mots alors au dernier mot le programme ne prend plus en compte la répétition des mot alors que le but de ce programme est justement de ne pas prendre en compte cette répetition
EX: normalement il ne dois pas charger la table avec ces donnés: (abcd ades derf abcd derf) mais malheuresement il la charge comme ca
aidez moi SVP car c'est un travail a remettre le plus vite possible. MERCI infiniment.
voici le programme écrit en pascal :

**********************************
program chainage_ouvert;
const n=5;
type cellule=record
cle:string;
link:integer;
end;
var v:array[0..n-1]of integer;
t:array[0..n-1]of cellule;
mot:string;
i,k,h,l:integer;
function hach(ch:string):integer;
var i,som:integer;
begin
som:=0;
for i:=1 to length(ch) do
som:=som+ord(ch[i]);
hach:=som mod n;
end;
procedure insert(var i:integer;y:integer);
var j,z:integer;
begin
if v[y]=-1 then
begin
t[i].cle:=mot;
v[y]:=i;
i:=i+1;
end
else
begin
if t[v[y]].cle=mot then
writeln('ce mot a deja ‚t‚ saisie')
else
begin
if t[v[y]].link=-1 then
begin
t[i].cle:=mot;
t[v[y]].link:=i;
i:=i+1;
end
else
begin
j:=v[y];
z:=1;
while (t[j].link<>-1) and (z=1) do
if t[j].cle<>mot then
j:=t[j].link
else
z:=0;
end;
if z=1 then
begin
t[i].cle:=mot;
i:=i+1;
end;
end;
end;
end;
BEGIN
h:=0;
for h:=0 to n-1 do
begin
v[h]:=-1;
t[h].link:=-1;
end;
i:=0;
while i<n do
begin
writeln('donnez un mot');
readln(mot);
if mot<>'' then
begin
k:=hach(mot);
insert(i,k);
end
else
begin
writeln('donnez un autre mot car ce que vous venez de taper n''est pas un caract‚re');
readln(mot);
end;
end;
l:=0;
while l<n do
begin
writeln(t[l].cle);
l:=l+1;
end;
writeln(' fin du programme hachage');
END.

2 réponses

sfrsky Messages postés 125 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 20 novembre 2014 18
23 févr. 2008 à 18:18
bonsoir;
quelqu'un peut m'aidé??? SVP
0
sfrsky Messages postés 125 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 20 novembre 2014 18
11 mars 2008 à 20:16
bonsoir a tous,
finalement j'ai regler le probléme et le programme pascal correct est

program chainage_ouvert;
uses wincrt;
const n=5;
type cellule=record
cle:string;
link:integer;
end;
var v:array[0..n-1]of integer;
t:array[0..n-1]of cellule;
mot:string;
i,k,h,l:integer;
function hach(ch:string):integer;
var i,som:integer;
begin
som:=0;
for i:=1 to length(ch) do
som:=som+ord(ch[i]);
hach:=som mod n;
end;
procedure insert(var i:integer;y:integer);
var j,z,u:integer;
begin
if v[y]=-1 then
begin
t[i].cle:=mot;
v[y]:=i;
i:=i+1;
end
else
begin
if t[v[y]].cle=mot then
writeln('ce mot a deja ete saisie:')
else
begin
if t[v[y]].link=-1 then
begin
t[i].cle:=mot;
t[v[y]].link:=i;
i:=i+1;
end
else
begin
j:=v[y];
z:=1;
u:=1;
while u<>0 do
if (t[j].link<>-1) and (z=1) then
if t[j].cle<>mot then
j:=t[j].link
else
begin
writeln('ce mot existe deja:');
z:=0;
u:=0;
end
else
u:=0;
end;
if z=1 then
begin
if t[j].cle<>mot then
begin
t[i].cle:=mot;
t[j].link:=i;
i:=i+1;
end
else
writeln('ce mot existe deja:');
end;
end;
end;
end;
BEGIN
h:=0;
for h:=0 to n-1 do
begin
v[h]:=-1;
t[h].link:=-1;
end;
writeln(' PROGRAMME HACHAGE');
writeln;writeln;writeln;
i:=0;
while i<n do
begin
writeln('donnez un mot:');
readln(mot);
if mot<>'' then
begin
k:=hach(mot);
insert(i,k);
end
else
begin
writeln('le grogramme ne calcule pas son code ASCII,donnez un autre mot:');
readln(mot);
end;
end;
writeln;
writeln(' affichage de la table remplis,sans repetition de mots');
l:=0;
while l<n do
begin
writeln(t[l].cle);
l:=l+1;
end;
writeln(' fin du programme hachage ');
END.
0