2014-10-28 42 views
0

给定一个集合S = {x1,x2,x3,x4,x5,...},其大小为n(< 20),我需要列出所有格子S上的大小为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; 
} 

显示Segementation故障(核心转储) 任何想法,为什么会出现这种情况呢? 由于提前

回答

0

formLattice()的代码有,只有那些顶点被探查连接到lattice[level-1]lattice[level]证据。当然,并不是每个格子都有一个总秩序(即{1,2,3,6})。当前程序如何选择顶点3作为lattice[2]而顶点2被存储到lattice[1]

换句话说,必须有另一种循环,从0lattice去为所有已经选择顶点到level-1,本环周围ptr