2013-03-18 6 views
1

입력의 첫 번째 행을 총 정점 수로 입력 파일에 대한 인접 행렬을 성공적으로 작성했으며 다음 행은 정점 쌍으로 임의의 순서로 가장자리입니다. 예를 들어인접성 매트릭스에서 인접성 목록을 작성하는 방법은 무엇입니까?

file.txt를

7 
1 2 
4 6 
4 3 
5 2 

그러나 나는이 프로그램을 실행하면, 인접성 매트릭스가 성공적으로 내장되어 있습니다,하지만 난 구조체 나무의 배열과 같은 인접리스트를 만들려고 프로그램 Seg 결함 (코어 덤프). 프로그램이 실패한 이유에 대한 단서가 있습니까? 문제의 기능은 다음과 같습니다

tree * buildAdjList(int a[][100], int n) 
{  int i, j, k; 
    tree *node; 
    tree * adjArray[n]; 
    for(i=0; i<=n; i++) 
      adjArray[i] = NULL; 
    for(j=0; j<=n; j++) 
      for(k=0; k<=n; k++) 
        if(a[j][k] == 1){ 
          node = (tree *)malloc(sizeof(tree)); 
          node->val = k; 
          node->next = adjArray[j]; 
          adjArray[j] = node; 
        } 
    return adjArray[0]; 
} 

프로그램의 나머지 :

일체의 도움을 많이 감사합니다
#include <stdio.h> 
#include <stdlib.h> 
struct tree{ 
    int val; 
    struct tree *next; 
}; 

typedef struct tree tree; 

void printArray(int a[][100],int n); 
void adjacencyMatrix(int a[][100], int n, int p1, int p2, FILE * inputF); 
tree * buildAdjList(int a[][100], int n); 
void printAdjArray(tree * adjArr[], int n); 

int main(int argc, char ** argv) 
{ 

int a[100][100]; 
int n,*q; 
FILE * inputFile; 
int entries, i; 
inputFile = fopen(argv[1], "r"); 
int p1, p2 =0; 
if(inputFile==NULL){ 
    printf("File failed to open."); 
    exit(EXIT_FAILURE); 
} 
fscanf(inputFile, "%d", &entries); 
tree * adjarray[entries]; 
q = (int *)malloc(sizeof(int)*n); 
adjacencyMatrix(a,entries,p1,p2,inputFile); 
adjarray[0] = buildAdjList(a, entries); 
printAdjArray(adjarray, entries); 
return 0; 
} 

void adjacencyMatrix(int a[][100], int n, int p1, int p2, FILE * inputF){ 
int i,j; 
do{ 
    for(i = 0;i <= n; i++) 
    { 
     for(j = 0;j <=n; j++) 
     { if(i==p1 && j == p2){ 
       a[i][j] = 1; 
       a[j][i] = 1; 
      } 
     } 
     a[i][i] = 0; 
    } 
}while(fscanf(inputF, "%d %d", &p1, &p2) !=EOF); 
    printArray(a,n); 
} 

:

답변

0

나는 문제가 빌드에 생각 :

tree * buildAdjList(int a[][100], int n) 
{  int i, j, k; 
    tree *node; 
    tree * adjArray[n]; 
    // work 
    return adjArray[0]; 
} 

로컬 변수 (범위를 벗어남)에서 메모리를 반환하려고합니다. 위의 코드에서 tree * adjArray[n]은 로컬 변수 배열을 로컬 주소 공간에 으로 만듭니다. 함수가 떠난 후에는 해당 배열의 헤드에 대한 포인터를 반환 할 수 없습니다.

일반적으로 목록 또는 노드를 만들려면 메모리가 힙에 살며 (따라서 작성 기능 자체에서 벗어날 수 있도록) malloc해야합니다. 같은 뭔가 :

tree * buildAdjList(int a[][100], int n) 
{ 
    tree *newtree = malloc(n * sizeof(tree *)); 
    // work 
    return newtree; 
} 

주 당신이있어 malloc에 ​​- 보내고 연속 메모리 블록 (읽기 : 배열) trees 전체 tree * 's 및하지의.

0

이 질문은 오래된 질문 이었지만 루프 카운터를 수행하는 방식에 문제가 발생했습니다. 이것은 C++이기 때문에 크기 n의 배열에있는 요소는 arr [0], arr [1], ... arr [n-1]입니다. 귀하의 코드는 배열 경계를 넘어서서 충돌을 일으킬 수있는 arr [n]을 참조합니다. 가 포함되지 않도록

귀하의 루프 로직은 다음과 같이 할 필요가 난 = n은 반복에서, 루프 테스트를위한에서 = 대신 <의 <를 사용하여 :

for (i = 0; i < n; i++) 
    adjArray[i] = NULL; 
관련 문제