Creative Code

main.c(generic list) 본문

C Programming

main.c(generic list)

빛하루 2023. 8. 28. 17:32

※main.c파일

#include <stdio.h>

#include <stdlib.h>

#include "list.h"



void printInt(const void *pData)

{

	printf("%d",*(int *)pData);

}

void printDouble(const void *pData)

{

	printf("%f",*(double *)pData);

}



int main(void)

{

	List list1,list2;

	initList(&list1,sizeof(int));

	initList(&list2,sizeof(double));

	

	int i;

	i = 4;		insertFirstNode(&list1,&i); //[4]

	i = 3; 	insertFirstNode(&list1,&i); //[3,4]

	i = 1;	 	insertFirstNode(&list1,&i); //[1,3,4]

	

	int j = 1;

	i = 2;		insertNode(&list1, &j, &i);  //[1,2,3,4]

	i = 3; 	deleteNode(&list1,&i); 		//[1,2,4]

	printList(&list1,printInt);

	

	double d;

	d =4.4;		insertFirstNode(&list2,&d); //[4.4]

	d =3.3; 		insertFirstNode(&list2,&d); //[3.3,4.4]

	d =1.1;	 	insertFirstNode(&list2,&d); //[1.1,3.3,4.4]

	

	double f = 1.1;

	d = 2.2;		insertNode(&list2, &f, &d);  //[1.1,2.2,3.3,4.4]

	d = 3.3; 		deleteNode(&list2,&d); 		//[1.1,2.2,4.4]

	printList(&list2,printDouble);

	

	cleanupList(&list1);

	cleanupList(&list2);

	return 0;

}

※list.h파일

#ifndef LIST_H

#define LIST_H



typedef struct node {

	struct node *next;

}Node;



typedef struct list {

	Node *ptr;

	int eleSize;

}List;



void initList(List *pList,int eleSize);

void cleanupList(List *pList);

void printList(const List *pList,void (*print)(const void*)); //임의의 자료를 받아서 출력하는 함수(함수포인터사용)



void insertFirstNode(List *pList, const void *pData); // 첫번째 노드에 데이터 추가

void insertNode(List *pList,const void *pPrevData, const void *pData); // prevdata 뒤의 노드에 데이터 추가

void deleteNode(List *pList, const void *pData);  // 데이터 삭제



#endif

※list.c파일

#include "list.h"

#include <stdlib.h>

#include <assert.h>

#include <stdio.h>

#include <string.h>



void initList(List *pList,int eleSize)

{

	pList -> ptr = malloc(sizeof(Node) /*+eleSize*/); // dummy nodes는 데이터가 필요없으므로 포인터만 남긴다.

	assert(pList->ptr); // 공간이 할당이 되었으면 계속 진행

	pList ->eleSize = eleSize;

	pList -> ptr -> next = NULL;

}

void cleanupList(List *pList)

{

	Node *ptr = pList ->ptr;

	while (ptr){

		Node *tmp = ptr;

		ptr = ptr->next;

		free(tmp);

	}

}



void printList(const List *pList,void (*print)(const void *)) 

{

	Node *ptr = pList->ptr->next;

	printf("[");

	while (ptr) {

		(*print)(ptr+1); // print(ptr+1);

		printf((ptr->next)? ", ":"");

		ptr = ptr->next;

	}

	printf("]\n");

}



void insertFirstNode(List *pList, const void *pData)

{

	Node *p = malloc(sizeof(Node) + pList->eleSize);

	assert(p);

	memcpy(p+1,pData,pList->eleSize);

	p->next = pList->ptr->next;

	pList->ptr->next = p;

}



void insertNode(List *pList, const void *pPrevData, const void *pData)

{

	Node *ptr = pList->ptr->next;

	while (ptr){

		if (memcmp(ptr+1,pPrevData,pList->eleSize) == 0) {

			break;

		}

		ptr = ptr->next;

	}

	if (ptr){

		Node *p = malloc(sizeof(Node)+pList ->eleSize);

		assert(p);

		memcpy(p+1,pData,pList->eleSize);

		p->next = ptr->next;

		ptr->next = p;

	}

}



void deleteNode(List *pList, const void *pData)

{

	Node *ptr = pList->ptr->next;

	Node *ptr2 = pList->ptr; // ptr뒤에서 따라가는 node

	while (ptr){

		if (memcmp(ptr+1,pData,pList->eleSize) == 0){

			break;

		}

		ptr = ptr->next;

		ptr2 = ptr2 ->next;

	}

	if (ptr){

		ptr2->next = ptr->next;

		free(ptr);

	}	

}

'C Programming' 카테고리의 다른 글

square(inline,매크로함수)  (0) 2023.09.11
main.c(리스트 createNode)  (0) 2023.08.28
main.c(리스트)  (0) 2023.08.28
main.c(queue memcpy)  (0) 2023.08.25
main.c(queue malloc)  (0) 2023.08.25