Задание звучит так. Древовидная структура строится из вершин, состоящих из двух полей: поля данных и указателя. Указатель ссылается на вспомогательный список, с помощью которого устанавливается связь текущей вершины с вершиной нижнего уровня. Каждый элемент этого списка содержит указатель на соседний элемент вспомогательного списка и на одну вершину нижнего уровня.
Я написал эту прогу, но у меня используются 4 указателя. Вот моя прога. Если можете исправьте ее.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct uzel
{
 int el;
 struct uzel *s1;
 struct uzel *s2;
 struct uzel *s3;
 struct uzel *s4;
} *koren;
char main_menu[10];
int j, nachalo, n, res;
struct uzel *init(struct uzel *kn);
void add(struct uzel *kn, int &nach);
void prisoedinenie(struct uzel *ke, struct uzel *ne);
struct uzel *del_el(struct uzel *kn, int &nach, int &itog);
struct uzel *recdel_el(struct uzel *bn, int del, int &it);
struct uzel *del_tr(struct uzel *kn, int nach);
void save(struct uzel *kn, int nach);
void recsave(struct uzel *kn, int order, FILE *bf, int k, int mas[], int max);
struct uzel *load(struct uzel *kn, int &nach);
void recload(struct uzel *bn, struct uzel *nel, char us[], int nomer);
void write(struct uzel *kn, int order, int i);
int lot(struct uzel *kn, int &l, int i);
void main()
{
clrscr();
koren=NULL; nachalo=1; n=0;
while (1)
{
 printf("1-inicializacia dereva\n");
 printf("2-dobavlenie novogo elementa v derevo\n3-udalenie elementa iz dereva s unichtozheniem poddereva podchinennih elementov\n");
 printf("4-udalenie dereva iz osnovnoy pamiati\n5-zapis dereva v fayl\n");
 printf("6-zagruzka dereva iz fayla\n7-vivod dereva\n8-vihod\n");
 printf("\nvvedite nomer punkta menu\n");
 scanf("%s", main_menu);
 switch(main_menu[0])
 {
  case '1':
   koren=init(koren);
   break;
  case '2':
   add(koren, nachalo);
   break;
  case '3':
   {
    if (koren!=NULL)
    {
     if (nachalo==1) {printf("derevo ne soderzhit ni odnogo elementa\n");}
     else
     {
      res=0;
      koren=del_el(koren, nachalo, res);
      if (res==1) {printf("element i podchinennoe emu podderevo uspeshno udaleni\n");}
      else {printf("derevo ne soderzhit takogo elementa\n");}
     }
    }
    else {printf("derevo ne sushestvuet\n");}
   }
   break;
  case '4':
   {
    if (koren!=NULL)
    {
     koren=del_tr(koren, nachalo);
     nachalo=1;
     printf("derevo uspeshno udaleno\n");
    }
    else {printf("derevo ne sushestvuet\n");}
   }
	break;
  case '5':
   save(koren, nachalo);
	break;
  case '6':
   koren=load(koren, nachalo);
	break;
  case '7':
   if (koren==NULL) {printf("derevo ne sushestvuet\n");}
   else
   {
    if (nachalo==1) {printf("derevo ne soderzhit ni odnogo elementa\n");}
    else
    {
     clrscr();
     n=lot(koren, n, 0);
     for (j=1; j<=n; j++) {write(koren, j, 1); printf("\n");}
    }
   }
	break;
  case '8':
   return;
  default:
   printf("neizvestnaya komanda\n\n");
 }
printf("nazhmite lubuyu klavishu");
getch();
clrscr();
}
}
struct uzel *init(struct uzel *kn)
{
int fli;
if (kn!=NULL)
{
 printf("v osnovnuyu pamiat uzhe zagruzheno derevo!\npri sozdanii novogo dereva vsia nesohranennaya informaciya budet poteriana\n");
 printf("recomenduetsia pered inicializaciey novogo dereva udalit predidushee s pomoshyu sootvetstvuyushey funnkcii v glavnom menu\n");
 printf("sozdat novoe derevo\n 1-da		2-net\n");
 scanf("%d", &fli);
 if (fli==2) {printf("deystvie otmeneno polzovatelem\n"); return kn;}
}
if ((kn=(struct uzel *)malloc(sizeof(struct uzel)))==NULL)
{
 printf("nedostatochno pamiati\n");
 return kn;
}
printf("sozdano novoe derevo\n");
return kn;
}
void add(struct uzel *kn, int &nach)
{
struct uzel *nn;
if (kn==NULL) {printf("derevo ne zagruzheno v osnovnuyu pamiat: proizvedite zagruzku iz fayla\nili sozdayte novoe derevo\n"); return;}
if (nach==1)
{
 printf("vvedite znachenie pervogo elementa\n");
 scanf("%d", &kn->el);
 kn->s1=NULL;
 kn->s2=NULL;
 kn->s3=NULL;
 kn->s4=NULL;
 nach=0;
 return;
}
if (nach==0)
{
 if ((nn=(struct uzel *)malloc(sizeof(struct uzel)))==NULL)
 {
  printf("nedostatochno pamiati\n");
 }
 else
 {
 printf("vvedite znachenie novogo elementa\n");
 scanf("%d", &nn->el);
 nn->s1=NULL;
 nn->s2=NULL;
 nn->s3=NULL;
 nn->s4=NULL;
 prisoedinenie(kn, nn);
 }
}
printf("uzel dobavlen\n");
}
void prisoedinenie(struct uzel *ke, struct uzel *ne)
{
int fli;
clrscr();
printf("viberite deystvie\n1 - ");
if (ke->s1==NULL) {printf("prisoedinit element v kachestve 1 vetvi\n");} else {printf("pereyti v 1 vetv\n");}
printf("2 - ");
if (ke->s2==NULL) {printf("prisoedinit element v kachestve 2 vetvi\n");} else {printf("pereyti vo 2 vetv\n");}
printf("3 - ");
if (ke->s3==NULL) {printf("prisoedinit element v kachestve 3 vetvi\n");} else {printf("pereyti v 3 vetv\n");}
printf("4 - ");
if (ke->s4==NULL) {printf("prisoedinit element v kachestve 4 vetvi\n");} else {printf("pereyti v 4 vetv\n");}
scanf("%d", &fli);
if ((fli==1)&(ke->s1==NULL)) {ke->s1=ne; return;}
if ((fli==2)&(ke->s2==NULL)) {ke->s2=ne; return;}
if ((fli==3)&(ke->s3==NULL)) {ke->s3=ne; return;}
if ((fli==4)&(ke->s4==NULL)) {ke->s4=ne; return;}
if ((fli==1)&(ke->s1!=NULL)) {prisoedinenie(ke->s1, ne);}
if ((fli==2)&(ke->s2!=NULL)) {prisoedinenie(ke->s2, ne);}
if ((fli==3)&(ke->s3!=NULL)) {prisoedinenie(ke->s3, ne);}
if ((fli==4)&(ke->s4!=NULL)) {prisoedinenie(ke->s4, ne);}
}
struct uzel *del_el(struct uzel *kn, int &nach, int &itog)
{
int delel;
printf("ukazhite udaliaemiy element\n");
scanf("%d", &delel);
if (kn->el==delel) {kn=del_tr(koren, nach); nach=1; itog=1; return kn;}
else
{
 if (kn->s1!=NULL) {kn->s1=recdel_el(kn->s1, delel, itog);}
 if (kn->s2!=NULL) {kn->s2=recdel_el(kn->s2, delel, itog);}
 if (kn->s3!=NULL) {kn->s3=recdel_el(kn->s3, delel, itog);}
 if (kn->s4!=NULL) {kn->s4=recdel_el(kn->s4, delel, itog);}
}
return kn;
}
struct uzel *recdel_el(struct uzel *bn, int del, int &it)
{
if (bn->el==del) {bn=del_tr(bn, 0); it=1; return bn;}
else
{
 if (bn->s1!=NULL) {bn->s1=recdel_el(bn->s1, del, it);}
 if (bn->s2!=NULL) {bn->s2=recdel_el(bn->s2, del, it);}
 if (bn->s3!=NULL) {bn->s3=recdel_el(bn->s3, del, it);}
 if (bn->s4!=NULL) {bn->s4=recdel_el(bn->s4, del, it);}
}
return bn;
}
struct uzel *del_tr(struct uzel *kn, int nach)
{
if (nach==0)
{
 if (kn->s1!=NULL) {kn->s1=del_tr(kn->s1, nach);}
 if (kn->s2!=NULL) {kn->s2=del_tr(kn->s2, nach);}
 if (kn->s3!=NULL) {kn->s3=del_tr(kn->s3, nach);}
 if (kn->s4!=NULL) {kn->s4=del_tr(kn->s4, nach);}
}
free(kn);
return NULL;
}
void save(struct uzel *kn, int nach)
{
int fli, maxord, i, massiv[500];
char nfayl[50];
FILE *fp;
fli=1;
if (kn==NULL) {printf("derevo ne sushestvuet\n"); return;}
if (nach==1) {printf("derevo ne soderzhit ni odnogo elementa\n"); return;}
printf("vvedite imia sohraniaemogo fayla\n");
scanf("%s", nfayl);
if ((fp=fopen(nfayl, "r"))!=NULL)
{
 fclose(fp);
 printf("fayl s imenem %s uzhe sushestvuet\nperepisat fayl\n 1 - da     2 - net\n", nfayl);
 scanf("%d", &fli);
}
if (fli==1)
{
 if ((fp=fopen(nfayl, "w"))==NULL)
 {
  perror("oshibka pri otkritii fayla\n");
  return;
 }
} else {printf("deystvie otmeneno polzovatelem\n"); return;}
maxord=0;
maxord=lot(kn, maxord, 0);
for (i=1; i<=maxord; i++) recsave(kn, i, fp, 1, massiv, maxord);
fclose(fp);
printf("informacia sohranena\n");
}
void recsave(struct uzel *kn, int order, FILE *bf, int k, int mas[], int max)
{
int h;
if (order==k)
{
 fprintf(bf, "%d ", kn->el);
 if (order==1) {fprintf(bf, "0");}
 else
 {
  for (h=0; h<=k-2; h++) fprintf(bf, "%d", mas[h]);
 }
 fprintf(bf, " ");
}
k=k+1;
if (order<k) {return;}
if (kn->s1!=NULL) {mas[k-2]=1; recsave(kn->s1, order, bf, k, mas, max);}
if (kn->s2!=NULL) {mas[k-2]=2; recsave(kn->s2, order, bf, k, mas, max);}
if (kn->s3!=NULL) {mas[k-2]=3; recsave(kn->s3, order, bf, k, mas, max);}
if (kn->s4!=NULL) {mas[k-2]=4; recsave(kn->s4, order, bf, k, mas, max);}
}
struct uzel *load(struct uzel *kn, int &nach)
{
struct uzel *nuzel;
int fli;
char nfayl[50], st[10];
FILE *fp;
if (kn==NULL) {printf("derevo ne sushestvuet\n"); return kn;}
if (nach==0) {printf("v osnovnuyu pamiat uzhe zagruzheno derevo!\npri zagruzke novogo dereva vsia nesohranennaya informaciya budet poteriana\n");
printf("recomenduetsia pered inicializaciey novogo dereva udalit predidushee s pomoshyu sootvetstvuyushey funnkcii v glavnom menu\n");
printf("sozdat novoe derevo\n 1-da		2-net\n");
scanf("%d", &fli);
if (fli!=1) {printf("deystvie otmeneno polzovatelem\n"); return kn;}}
printf("vvedite imia zagruzhaemogo fayla\n");
scanf("%s", nfayl);
if ((fp=fopen(nfayl, "r"))==NULL)
{
 perror("oshibka pri otkritii fayla");
 return kn;
}
while (!feof(fp))
{
 if ((nuzel=(struct uzel *)malloc(sizeof(struct uzel)))==NULL)
 {
  printf("nedostatochno pamiati\n");
  return kn;
 }
 fscanf(fp, "%d", &nuzel->el);
 nuzel->s1=NULL;
 nuzel->s2=NULL;
 nuzel->s3=NULL;
 nuzel->s4=NULL;
 fscanf(fp, "%s", st);
 if (st[0]=='0') {kn=nuzel;}
 recload(kn, nuzel, st, 0);
}
nach=0;
fclose(fp);
printf("zagpuzheno\n");
return kn;
}
void recload(struct uzel *bn, struct uzel *nel, char us[], int nomer)
{
if ((us[nomer]=='1')&(bn->s1!=NULL)) {nomer=nomer+1; recload(bn->s1, nel, us, nomer);}
if ((us[nomer]=='2')&(bn->s2!=NULL)) {nomer=nomer+1; recload(bn->s2, nel, us, nomer);}
if ((us[nomer]=='3')&(bn->s3!=NULL)) {nomer=nomer+1; recload(bn->s3, nel, us, nomer);}
if ((us[nomer]=='4')&(bn->s4!=NULL)) {nomer=nomer+1; recload(bn->s4, nel, us, nomer);}
if ((us[nomer]=='1')&(bn->s1==NULL)) {bn->s1=nel;}
if ((us[nomer]=='2')&(bn->s2==NULL)) {bn->s2=nel;}
if ((us[nomer]=='3')&(bn->s3==NULL)) {bn->s3=nel;}
if ((us[nomer]=='4')&(bn->s4==NULL)) {bn->s4=nel;}
return;
}
void write(struct uzel *kn, int order, int i)
{
if (i==order) {printf("%d ", kn->el);}
i=i+1;
if (kn->s1!=NULL) {write(kn->s1, order, i);}
if (kn->s2!=NULL) {write(kn->s2, order, i);}
if (kn->s3!=NULL) {write(kn->s3, order, i);}
if (kn->s4!=NULL) {write(kn->s4, order, i);}
}
int lot(struct uzel *kn, int &l, int i)
{
if (kn==NULL) {return 0;} else {i=i+1;}
if (kn->s1!=NULL) {lot(kn->s1, l, i);} else {if (i>l) {l=i;}}
if (kn->s2!=NULL) {lot(kn->s2, l, i);} else {if (i>l) {l=i;}}
if (kn->s3!=NULL) {lot(kn->s3, l, i);} else {if (i>l) {l=i;}}
if (kn->s4!=NULL) {lot(kn->s4, l, i);} else {if (i>l) {l=i;}}
return l;
}
Заранее спасибо!