Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Графы на С - не работает


Автор: darkness 7.11.2006, 12:49
Делал направленные  графы на С:

Код

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<dos.h>
#include<alloc.h>
#include<math.h>

#define TOP struct top
#define SPISOK struct spisok


SPISOK                    //spisok inzedentnosti
{
  int vr;
  SPISOK* list;
};

TOP                       // verchina
{
 int vr;
 SPISOK *sub;
 TOP *next;
};


TOP *fir;
TOP *now;
//fir=(TOP*)malloc(sizeof(TOP));
//fir->next=NULL;
void print_data ()    //pechat'
{
 TOP *uk1;
 SPISOK *uk2, uk3;
 while(fir->next!=NULL)
 {
   printf("   %d\n", fir->vr);
   uk2=fir->sub;
   while (uk2->list!=NULL)
   {
   printf("   %d\n", uk2->vr);
    uk2=uk2->list;
   }
 }

}

void add_top_vr (int l)
{
  TOP *uk1;
  uk1=(TOP*) malloc(sizeof(TOP));
  if (fir->next==NULL)
  {
   fir->next=uk1;
   uk1->next=NULL;
  }
  else
  {
  now->next=uk1;
  uk1->next=NULL;
  }
  uk1->vr=l;
  now=uk1;
  return;
}

void  add_sub_vr(int l, int p)     // l - numer verchini  p - znachenie   добавляет в список инциндетности
{
 TOP *uk1;
 SPISOK *uk2;
 while (fir->next!=NULL)            // obrabotka uslovia???
 {
  uk1=fir->next;
  fir=uk1;
  if (fir->vr==l) break;
 }
 uk2=(SPISOK*)malloc(sizeof(SPISOK));
 fir->sub=uk2;
 uk2->list=NULL;
 uk2->vr=p;
}


int main()
{
      add_top_vr (4);
      add_top_vr (6);
      add_top_vr (17);
      add_top_vr (54);
      add_top_vr (2);

      add_sub_vr( 2,  7);
      add_sub_vr( 2,  8);
      print_data ();

      getch();
      system("PAUSE");
      return 0;
}



Бажная функуия как я понял - это  add_top_vr() .... но до коца не могу догнать...
HELP PLEASE!!!!  


P.S.:
Примерная струтура которая должна была получиться это:
 NULL[указ]->6[указ]->9[указ]->4[указ]->11[NULL]
                          |                              |
                         \|/                           \|/
          [список инц-ти]              [список инц-ти]

Автор: chaos 7.11.2006, 15:22
boost::graph тебе в помощь  smile 

Автор: archimed7592 8.11.2006, 07:11
Цитата(chaos @  7.11.2006,  16:22 Найти цитируемый пост)
boost::graph тебе в помощь   
Цитата(darkness @  7.11.2006,  13:49 Найти цитируемый пост)
Делал направленные  графы на С:
 smile  smile 
darkness, твои основные ошибки: не инициализировал ни fir, ни now, ни указатели в самих вершинах. использовал глобальные переменные (fir) как "итераторы", неоднократно пытался проверить fir->next заведомо не зная является ли fir валидным указателем.
Код
#include <stdio.h>
//#include <conio.h> // в Си нет такого хедера 
#include <string.h>
#include <dos.h>
//#include <alloc.h> // такого тоже нету, malloc объявлен в stdlib.h
#include <math.h>
#include <stdlib.h> // added
#include <assert.h> // added

#define TOP struct top
#define SPISOK struct spisok


SPISOK                    //spisok inzedentnosti
{
    int vr;
    SPISOK* list;
};

TOP                       // verchina
{
    int vr;
    SPISOK *sub;
    TOP *next;
};


TOP *fir = NULL; // added ` = NULL`
TOP *now = NULL; // added ` = NULL`;

//fir=(TOP*)malloc(sizeof(TOP));
//fir->next=NULL;

void print_data ()    //pechat'
{
    TOP *uk1 = fir; // added ` = fir`
    SPISOK *uk2; // removed `, uk3`
    while(uk1 != NULL)
    {
        printf("%2d:", uk1->vr);
        uk2 = uk1->sub; // corrected
        if (uk1->sub == NULL) // added
        {
            printf (" empty\n"); // added
            uk1 = uk1->next;
            continue; // added
        };
        while (uk2 != NULL) // corrected
        {
            printf(" %2d", uk2->vr); // corrected
            uk2 = uk2->list;
        };
        printf ("\n"); // added
        uk1 = uk1->next;
    };
}

void add_top_vr (int l)
{
    TOP *uk1;
    uk1=(TOP*) malloc(sizeof(TOP));
    uk1->next = NULL; // moved
    uk1->sub = NULL; // added
    if (fir == NULL) // corrected
        fir = uk1; // corrected
    else
        now = now->next = uk1; // corrected
    uk1->vr = l;
    now = uk1;

    return;
}

void  add_sub_vr(int l, int p)     // l - numer verchini  p - znachenie   добавляет в список инциндетности
{
    TOP *uk1 = fir; // added ` = fir`
    SPISOK *uk2;
    while (uk1 != NULL) // corrected  // obrabotka uslovia??? ага, она самая, обработка условия LOL
        if (uk1->vr == l) // corrected
            break;
        else
            uk1 = uk1->next; // corrected
    assert (uk1->vr == l); // added
    uk2 = (SPISOK *) malloc (sizeof (SPISOK));
    uk2->list = uk1->sub; // corrected
    uk1->sub = uk2; // added
    uk2->vr = p;
}


int main()
{
    add_top_vr (4);
    add_top_vr (6);
    add_top_vr (17);
    add_top_vr (54);
    add_top_vr (2);

    add_sub_vr (2, 6);
    add_sub_vr (2, 4);
    add_sub_vr (4, 2);
    add_sub_vr (4, 6);
    add_sub_vr (4, 54);
    add_sub_vr (17, 54);
    add_sub_vr (54, 2);
    //add_sub_vr (10, 1); // try uncomment it.

    print_data ();

    //      getch(); // в Си нету такой ф-ции
    system("PAUSE");
    return 0;
}

Автор: darkness 9.11.2006, 08:03
archimed7592, да действительно... на выспавшуюся голову посмотрел код - немного даже ужаснулся....
Вот мой готовый вариант....:

Код

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<dos.h>
#include<alloc.h>
#include<math.h>

#define TOP struct top
#define SPISOK struct spisok


SPISOK
{
  int vr;
  SPISOK* list;
};

TOP
{
 int vr;
 SPISOK *sub;
 TOP *next;
};


TOP *fir, *balv;
TOP *now;
SPISOK *bal;
//fir=0;
//fir=(TOP*)malloc(sizeof(TOP));
//fir->next=NULL;
void print_data ()    //pechat'
{
 TOP *uk1;
 SPISOK *uk2, uk3;
 uk1=fir;
 while(uk1->next!=NULL)
 {
   printf("   %d  ", uk1->vr);
   uk2=uk1->sub;
   //uk1=
   uk1=uk1->next;

   while (uk2->list!=NULL)
   {
   printf("   \n%d ", uk2->vr);
    uk2=uk2->list;
   }
 }

}

void add_top_vr (int l)
{
  TOP *uk1; /**uk2*/
  uk1=(TOP*) malloc(sizeof(TOP));
  //uk2=(TOP*) malloc (sizeof(TOP));
  //uk2=fir;
  if (fir->vr==NULL)
  {
   /*fir->next=uk1;
   uk1->next=NULL;
   uk1->sub=NULL; */
   uk1=fir;
   uk1->vr=l;
   uk1->next=balv;           //!!!!!!!!!!!!!

  }
  else
  {
  now->next=uk1;
  uk1->next=balv;
  }
  uk1->vr=l;
  uk1->sub=bal;
  now=uk1;
}

void  add_sub_vr(int l, int p)     // l - numer verchini  p - znachenie
{
 TOP *uk1;
 SPISOK *uk2;
 uk1=fir;
 while (uk1->next!=NULL)            // obrabotka uslovia???
 {

  //fir=uk1;
  if (uk1->vr==l) {/*printf(" %d \n ", uk1->vr);*/break;}
  uk1=uk1->next;
 }

 uk2=(SPISOK*)malloc(sizeof(SPISOK));
 uk1->sub=uk2;
 uk2->list=bal;
 uk2->vr=p;

 /*fir->sub=uk2;
 uk2->list=bal;
 uk2->vr=p; */
}


int main()
{
      fir=(TOP*) malloc (sizeof(TOP));
      now=(TOP*) malloc (sizeof(TOP));
      balv= (TOP*) malloc (sizeof(TOP));
      bal=   (SPISOK*) malloc (sizeof(SPISOK));
      fir->vr=NULL;
      balv->vr=NULL;
      balv->next=NULL;
      bal->list=NULL;


      add_top_vr (4);
      add_top_vr (6);
      add_top_vr (17);
      add_top_vr (54);
      add_top_vr (3);
      //print_data ();
      getch();
      add_sub_vr( 4,  7);
      add_sub_vr( 6,  8);
      print_data ();

      getch();
      system("PAUSE");
      return 0;
}




Сейчас вроде всё работает.... Только с печатью пока не совсем разобрался.... Но это тоже в процессе...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)