2014-10-28 4 views
0

크기가 n (< 20) 인 집합 S = {x1, x2, x3, x4, x5, ...} 인 경우 모든 격자 S의 부분 집합)을 크기 k로 (입력으로 받아 들여야하지만, 제 질문으로는 디버깅 목적으로 수정해야합니다). 부분 순서가 정의되는 관계는 나눗셈입니다.부분 집합 집합 분할 오류 격자 (코어 덤프)

#include <stdio.h> 
#include <stdbool.h> 

typedef struct{ 
    int data; 
    struct node* next; 
}node; 

void addEdge(node* graph[],int a,int b){ 
    node *ptr=(node *)malloc(sizeof(node)); 
    ptr->next=graph[a]; 
    ptr->data=b; 
    graph[a]=ptr; 
} 

void buildGraph(node* graph[],int n){ 

    int i,j; 
    for(i=2;i<=n;i++){ 
     for(j=1;j<=i/2;j++){ 
      if(i%j==0){ 
       if(j!=1) addEdge(graph,i/j,i); 
       else addEdge(graph,j,i); 
      } 
     } 
    } 
} 

void printGraph(node* graph[],int n){ 
    int i=0; 
    node *ptr; 
    for(i=0;i<=n;i++){ 
     ptr=graph[i]; 
     printf("Row-%d ",i); 
     while(ptr!=NULL){ 
      printf("%d ",ptr->data); 
      ptr=ptr->next; 
     } 
     printf("\n"); 
    } 
} 

void print(int array[],int n){ 
    int i; 
    for(i=0;i<n;i++) printf("%d ",array[i]); 
    printf("\n"); 
} 

bool checkDuplicate(int array[],int n,int a){ 
    int i; 
    for(i=0;i<n;i++) if(array[i]==a) return false; 
    return true; 
} 
void formLattice(node* graph[],int lattice[],int k,int vertex,int level){ 
    //printf("Level-%d \n",level); 
    if(level>k) return; 
    if(level==k) { 
     lattice[level-1]=vertex; 
     print(lattice,k); 
     return; 
    } 
    lattice[level-1]=vertex; 
    node* ptr=graph[vertex]; 
    while(ptr!=NULL){ 
    // if(checkDuplicate(lattice,level,ptr->data)) 
     formLattice(graph,lattice,k,ptr->data,level+1); 
     ptr=ptr->next; 
    } 
} 
void printLattice(node* graph[],int n,int k){ 
    int lattice[k],i; 
    node* ptr; 
    for(i=1;i<=n;i++){ 
     ptr=graph[i]; 
     while(ptr!=NULL){ 
      lattice[0]=i; 
      formLattice(graph,lattice,k,ptr->data,2); 
      ptr=ptr->next; 
     } 
    } 
} 
int main(void) { 

    int n=10,k=4; 
    node* graph[n+1]; 
    int i; 
    for(i=0;i<=n;i++) graph[i]=NULL; 
    buildGraph(graph,n); 
// printGraph(graph,n); // Comment to print out the Hasse Diagram 
    printLattice(graph,n,k); 
    return 0; 
} 

어떤 생각이 왜 그렇게 일어나고 세그멘트 오류 (코어 덤프)보기? 덕분에 사전

답변

0

formLattice()의 코드는 그 정점이 lattice[level-1]에 연결되어 lattice[level] 조사해서하는 증거가있다. 물론 모든 격자가 그것에 대한 전체 질서를 가지고있는 것은 아닙니다 (즉 {1,2,3,6}은 아닙니다). 현재 프로그램이 lattice[2]에 대한 버텍스 3을 선택하고 버텍스 2를 lattice[1]에 저장하려면 어떻게해야합니까?

즉, ptr위한 본 루프 주위에 level-10에서 lattice모든 이미 선택된 정점 가고, 다른 루프가 있어야한다.