Notice
Recent Posts
Recent Comments
Link
헬창 개발자
연결 리스트를 이용한 희소 행렬 표현 : C언어 본문
<설계도>
<코드>
#include <stdio.h>
typedef struct NodeList { //노드 리스트 구조체
struct NodeList* link; // 다음 노드를 가리킴
int data; // 데이터 값
int row; // 행
int col; // 열
}Node;
void insert(Node** head, Node** p, int data, int row, int col) { // 노드 리스트 생성 함수 (머리노드, 선행노드, 데이터, 행, 열)
Node* NewNode = (Node*)malloc(sizeof(Node)); // NewNode 생성
NewNode->link = NULL; // 초기화
NewNode->data = data; // NewNode 데이터 입력
NewNode->row = row; // NewNode 행 입력
NewNode->col = col; // NewNode 열 입력
if (*head == NULL) { // 첫 노드를 만드는 경우
*head = NewNode; // 머리 노드와 첫 노드를 연결
*p = NewNode; // 선행 노드 포인터가 NewNode를 가리킴
}
else {
(*p)->link = NewNode; // 선행 노드가 NewNode를 가리킴
*p = NewNode; // 선행 노드 포인터가 NewNode를 가리킴
}
}
void print(Node* head, int cnt) { // 0이 아닌 값들 출력 함수 (머리노드, 0이 아닌 개수)
Node* ph = head; // ph는 첫 노드를 가리킴
printf("행\t열\t데이터\n");
for (int i = 0; i < cnt; i++) // 0이 아닌 원소들의 개수만큼 반복
{
printf("%d\t%d\t%d ", ph->row, ph->col, ph->data); // 행, 열, 데이터 값을 출력
ph = ph->link; // 다음 노드를 가리킴
puts("");
}
}
int main() {
int array[5][5] = { // 5x5 희소행렬 생성
{30,2,0,0,0},
{3,99,0,0,0},
{0,0,0,51,11},
{6,55,0,0,0},
{0,0,88,0,0} };
Node* head = NULL; // 머리 노드
Node* p = NULL; // 선행 노드를 가리키는 p
int cnt = 0; // 희소행렬에 0이 아닌 값들의 개수
int c = sizeof(array[0]) / sizeof(int); // 열의 사이즈
int r = sizeof(array) / sizeof(array[0]); // 행의 사이즈
for (int i = 0; i < r; i++) // 행과 열의 사이즈 만큼 이중 반복
{
for (int j = 0; j < c; j++)
{
if (array[i][j] != 0) { // 0이 아닌 값 판별
int temp = array[i][j]; // 0이 아닌 값을 temp 대입
insert(&head, &p, temp, i, j); // 원소값들을 연결리스트로 만드는 함수 호출
cnt++; // 0이 아닌 값들의 개수+
}
}
}
print(head, cnt); // 출력 함수 호출
}
<결과 화면>
'자료구조' 카테고리의 다른 글
큐를 이용한 피보나치 수열 : C언어 (0) | 2021.07.27 |
---|---|
깊이 우선 탐색(dfs), 넓이 우선 탐색(bfs) 구현 : C언어 (0) | 2021.07.23 |
스택을 이용한 회문 검사 프로그램 : C언어 (0) | 2021.07.22 |
이중 연결 리스트 구현 : C언어 (0) | 2021.07.21 |
단일 연결 리스트 값 탐색하기 : C언어 (0) | 2021.07.19 |
Comments