c - 偏序集分段故障的格(核心转储)

标签 c graph linked-list relation

给定一个大小为 n (< 20) 的集合 S = {x1,x2,x3,x4,x5,….},我需要列出 S 上大小为 k 的所有格子(S 的子集)(应该被视为输入,但在我的问题中我修复了它以用于调试目的)。定义偏序的关系是整除性。

 #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;
}

显示段错误(核心已转储) 知道为什么会这样吗? 提前致谢

最佳答案

formLattice() 的代码有证据表明,只有那些连接到 lattice[level-1]< 的顶点才会被探测到 lattice[level]/。当然,并不是每个格子都有全序(即 {1,2,3,6} 没有)。当前程序如何为lattice[2]选择顶点3,而顶点2存储在lattice[1]中?

换句话说,必须有另一个循环,将lattice所有已选择的顶点从0转到level- 1,围绕 ptr 的当前循环。

关于c - 偏序集分段故障的格(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26605179/

相关文章:

algorithm - 在有向图和无向图上工作以检测循环的单一算法?

c - C语言中如何删除链表?

c - 通过值和引用将 c 中结构类型的指针传递给函数

c - 在 C 中的 O(N) 中搜索 Trie

c - printf的内部

c - 需要一点帮助来修复 Arduino RFID 程序

c - C语言中的关键事件

R:iGraph数据对象中如何从根节点遍历到每个叶子节点并获取路径?

java - 看懂罗盘的布局算法

c++ - 使用 gcc 插件插入全局变量声明