#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode
{
int row;
int col;
int value;
struct ListNode *link;
} ListNode;
typedef struct ListHeader
{
int length;
ListNode *head;
ListNode *tail;
} ListHeader;
void init (ListHeader *plist)
{
plist -> length = 0;
plist -> head = NULL;
plist -> tail = NULL;
}
void insert_node_last(ListHeader *plist, int row, int col, int value)
{
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
if(temp==NULL) fprintf(stderr,"메모리 할당 에러\n");
temp->row=row;
temp->col=col;
temp->value=value;
temp->link = NULL;
if(plist->tail=NULL)
{
plist->head=plist->tail=temp;
}
else
{
plist->tail->link = temp;
plist->tail=temp;
}
plist->length++;
}
void sparse_matrix_add2(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3, int n2)
{
ListNode *a = plist1->head;
ListNode *b = plist2->head;
int sum;
while(a->link!=NULL && b->link!=NULL)
{
int inda = (a->row)*n2 + a->col;
int indb = (b->row)*n2 + b->col;
if(inda<indb)
{
insert_node_last(plist3,a->row,a->col,a->value);
a=a->link;
}
else if(inda == indb)
{
sum = a->value + b->value;
if(sum!=0)
{
insert_node_last(plist3,a->row,a->col,sum);
a=a->link, b=b->link;
}
else a=a->link,b=b->link;
}
else if(inda>indb)
{
insert_node_last(plist3,b->row,b->col,b->value);
b=b->link;
}}
for(;a!=NULL;a=a->link)
insert_node_last(plist3,a->row,a->col,a->value);
for(;b!=NULL;b=b->link)
insert_node_last(plist3,b->row,b->col,b->value);
}
void sparse_matrix_print(ListHeader *plist)
{
ListNode *p=plist->head;
for(;p;p=p->link)
printf(" %d %d %d\n",p->row,p->col,p->value);
}
void main()
{
ListHeader list1,list2,list3;
int row=0,col=0,value=0;
int n1=0,n2=0,n3=0;
int m1=0,m2=0,m3=0;
int s=0;
FILE *fp=NULL, *fs=NULL;
init(&list1);
init(&list2);
init(&list3);
fp=fopen("input.txt","rt");
if(fp==NULL)
{
printf("input.txt 파일오픈불가 \n");
fclose(fp);
return;
}
else
{
fscanf(fp,"%d %d %d",&n1,&n2,&n3);
while(1)
{
if(fscanf(fp,"%d %d %d", &row,&col,&value) != (n1,n2,value))
insert_node_last(&list1, row, col, value);
else
{
m1=row, m2=col;
break;
}
}
//fscanf(fp,"%d %d %d",&m1,&m2,&m3);
//if(m1==n1 && m2==n2)
//break;
while(1)
{
if(fscanf(fp,"%d %d %d", &row, &col, &value)!=EOF)
insert_node_last(&list2,row,col,value);
else break;
}
sparse_matrix_print(&list1);
sparse_matrix_print(&list2);
}}
안녕하세요
C언어로 row랑 column이랑 value로 구성된 Sparse Matrix를 Linked List로 구현해서 덧셈연산하는 프로그램을 짜고 있는데요.
새로운 node 추가하는 함수랑 덧셈연산하는 함수를 정의하고 아래와 같은 내용의 input.txt에서 두 sparse matrix를 받아서 덧셈연산 해서 output.txt에 출력하게 하려는 프로그램인데요
그 중에서 input.txt에서 fscanf로 값을 받아 엔터 기준 윗부분은 list1에 노드를 계속 추가하고 아랫부분은 list2에 추가하는 소스만 올려봤습니다.
그리고 소스 맨 밑 부분 sparse_matrix_print(&list1)이랑 2는 메모장에서 잘 불러와서 잘 저장했는지 확인하는 함수고요.
컴파일은 되는데 디버그하니까 자꾸 이런 오류가 뜨네요
main.c.exe의 0x00c01504에 처리되지 않은 예외가 있습니다. 0xC0000005: 0x0000000c 위치를 기록하는 동안 액세스 위반이 발생했습니다.
그리고 아래쪽 지역(?)을 보니 pllist의 head의 row랑 col이랑 value, link에
CXX0030 오류 : 식을 계산할 수 없습니다. 이런 것도 보이고요.
아 진짜 돌겠네요 뭐가 틀렸는지 감이 안잡히니까 뭘 어떻게 방향을 잡아야 할 지 모르겠습니다. 살려주세요
input.txt
2 3 3
0 0 2
0 2 1
1 2 3
2 3 4
0 0 1
0 1 1
0 2 2
1 1 2
output.txt
Addition
2 3 5
0 0 3
0 1 1
0 2 3
1 1 2
1 2 3
|