배우고픈 공돌이
범용 싱글 리스트 본문
//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_t list1, list2; initList(&list1, sizeof(int)); initList(&list2, sizeof(double)); int i=10; insertFirstNode(&list1,&i); int j = 40; insertNode(&list1,&i,&j); j = 30; insertNode(&list1,&i,&j); j = 20; insertNode(&list1,&i,&j); printList(&list1,printInt); // { 10, 20, 30, 40} double x=1.1; insertFirstNode(&list2,&x); double y = 4.4; insertNode(&list2,&x,&y); y = 3.3; insertNode(&list2,&x,&y); y = 2.2; insertNode(&list2,&x,&y); printList(&list2,printDouble); // { 1.1, 2.2, 3.3, 4.4} j=30; deleteNode(&list1, &j); printList(&list1,printInt); y=3.3; deleteNode(&list2, &y); printList(&list2,printDouble); cleanupList(&list1); cleanupList(&list2); return 0; }
//list.c #include "list.h" #include <stdio.h> #include <stdlib.h> #include <string.h> void initList(list_t *pList, int element_size) { pList->ptr = malloc(sizeof(list_t)); pList->ptr->next = NULL; pList->element_size = element_size; } void cleanupList(list_t *pList) { node_t *ptr = pList->ptr; while(ptr) { node_t *tmp = ptr; ptr = ptr->next; free(tmp); } pList->ptr = NULL; } void printList(const list_t *pList, void (*print)(const void*)) { node_t *ptr; if(pList->ptr) ptr = pList->ptr->next; else ptr = NULL; while(ptr) { print(ptr+1); printf(" "); ptr = ptr->next; } printf("\n"); } void insertFirstNode(list_t *pList, const void *pData) { node_t *tmp = malloc(sizeof(node_t)+pList->element_size); memcpy(tmp +1 ,pData,pList->element_size); tmp->next = pList->ptr->next; pList->ptr->next = tmp; } void insertNode(list_t *pList, const void *pPrevData, const void *pData) { node_t *ptr = pList->ptr->next; while(ptr) { if(memcmp(ptr+1,pPrevData,pList->element_size) == 0) break; ptr = ptr->next; } if(ptr) { node_t *tmp = malloc(sizeof(node_t)); memcpy(tmp+1,pData,pList->element_size); tmp->next = ptr->next; ptr->next = tmp; } } void deleteNode(list_t *pList, const void *pData) { node_t *ptr1 = pList->ptr->next; node_t *ptr2 = pList->ptr; while(ptr1) { if(memcmp(ptr1 + 1, pData, pList->element_size) == 0) break; ptr1=ptr1->next; ptr2=ptr2->next; } if(ptr1) { ptr2->next = ptr1->next; free(ptr1); } }
//list.h #ifndef LIST_H #define LIST_H typedef struct node{ struct node* next; }node_t; typedef struct { node_t *ptr; int element_size; }list_t; void initList(list_t *pListi, int element_size); void cleanupList(list_t *pList); void printList(const list_t *pList,void (*print)(const void*)); void insertFirstNode(list_t *pList, const void *pData); void insertNode(list_t *pList, const void *pPrevData, const void *pData); void deleteNode(list_t *pList, const void *pData); #endif // end of list.h
Comments