Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- 프로그래밍
- 개발
- 빅데이터
- SNS
- 코딩
- 코딩독학
- 프로그램
- 주가예측
- 풀스택프레임워크
- 프로그래머스
- Python
- C++
- 자바
- 자바정리
- frontend
- 자바독학
- Project
- 개인프로젝트
- Reflex
- 코딩테스트
- 사물인터넷
- java정리
- 이웃한 칸
- 백준
- 모의 주식
- 개발자
- 코테
- backend
- java
- 코스닥
Archives
- Today
- Total
Creative Code
main.c(generic list) 본문
※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 |