헬창 개발자

연결 리스트를 이용한 희소 행렬 표현 : C언어 본문

자료구조

연결 리스트를 이용한 희소 행렬 표현 : C언어

찬배 2021. 7. 20. 10:19

<설계도>

<코드>

#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); // 출력 함수 호출
}

<결과 화면>

Comments