📄 e_ll.c
字号:
/*------------------------------------------------------------------------** Copyright 1998 by Paul Leventis, Jonathan Rose and the University of ** Toronto. Use is permitted, provided that this attribution is retained ** and no part of the code is re-distributed or included in any commercial ** product except by written agreement with the above parties. ** ** For more information, contact us directly: ** Paul Leventis (leventi@eecg.utoronto.ca) ** Jonathan Rose (jayar@eecg.toronto.edu) ** Department of Electrical and Computer Engineering ** University of Toronto, 10 King's College Rd., ** Toronto, Ontario, CANADA M5S 1A4 ** Phone: (416) 978-6992 Fax: (416) 971-2286 **------------------------------------------------------------------------*//* * e_ll.c * Generalised linked list functions * * P. Leventis, July 1997*/#include <stdlib.h>#include "e_ll.h"#include "e_shared.h"#define MAIN 0struct dummyStruct { char *name;};void ll_restart(LL *pLL){ pLL->ppCurrEntry = &(pLL->pFirstEntry);}void ll_insert(LL *pLL, void *payload){ LL_ENTRY *pNewEntry; pNewEntry = (LL_ENTRY*) malloc(sizeof(LL_ENTRY)); mem_assert(pNewEntry); pNewEntry->pPayload = payload; pNewEntry->pNextEntry = *(pLL->ppCurrEntry); *(pLL->ppCurrEntry) = pNewEntry; pLL->nEntries++;}void* ll_alloc(void (*free_payload)(void *)) { LL *pLL; pLL = malloc(sizeof(LL)); mem_assert(pLL); pLL->pFirstEntry = NULL; pLL->ppCurrEntry = &(pLL->pFirstEntry); pLL->free_payload = free_payload; pLL->nEntries = 0; return pLL;}int ll_add(LL *pLL, void *payload){ ll_restart(pLL); ll_insert(pLL, payload); return 1;}int ll_inc(LL *pLL){ if(*(pLL->ppCurrEntry) == NULL) return 0; pLL->ppCurrEntry = &(*(pLL->ppCurrEntry))->pNextEntry; if(*(pLL->ppCurrEntry) == NULL) return 0; return 1;}void *ll_get(LL *pLL){ return (*(pLL->ppCurrEntry))->pPayload;}void *ll_take(LL *pLL){ LL_ENTRY *pTemp; pTemp = *(pLL->ppCurrEntry); if(pTemp != NULL) { *(pLL->ppCurrEntry) = (*(pLL->ppCurrEntry))->pNextEntry; pLL->nEntries--; } return pTemp;}void ll_remove(LL *pLL){ LL_ENTRY *pTemp = ll_take(pLL); pLL->free_payload(pTemp->pPayload); free(pTemp);}void ll_free_helper(LL *pLL){ LL_ENTRY *pCurr; if(!pLL) return; pCurr = pLL->pFirstEntry; while(pCurr) { LL_ENTRY *pTemp = pCurr; pCurr = pCurr->pNextEntry; pLL->free_payload(pTemp->pPayload); free(pTemp); } free(pLL);}/* Assumes that the first entry is the name!!! */void *ll_search(LL *pLL, char *name){ LL_LOOP(pLL) { struct dummyStruct *stringStruct = (struct dummyStruct *) ll_get(pLL); my_assert(stringStruct); if(!strcmp(stringStruct->name, name)) return stringStruct; } return NULL;} #if MAINvoid free_payload(void *payload){ free( (int *) payload);}int main(void){ LL my_LL; char command; int val, *pPayload; printf( "a: add iVal\n" "b: back to beginning\n" "d: dump list to screen\n" "h: get help\n" "i: insert entry\n" "n: next entry\n" "p: print current entry\n" "q: quit\n" "r: remove entry\n\n" ); ll_init(&my_LL, free_payload); while(1) { scanf("%c", &command); switch(command) { case 'a': scanf("%d", &val); pPayload = (int *) malloc(sizeof(int)); *pPayload = val; printf("Adding value %d to list.\n", *pPayload); ll_add(&my_LL, pPayload); break; case 'd': printf("Dumping list contents...\n"); ll_restart(&my_LL); while(*(my_LL.ppCurrEntry)) { printf("%d ", *((int *) ll_get(&my_LL))); ll_inc(&my_LL); } printf("\n"); break; case 'p': if(ll_at_end(&my_LL)) printf("At end of list.\n"); else printf("Current entry: %d\n", *((int *) ll_get(&my_LL))); break; case 'b': printf("Restarting at head of list.\n"); ll_restart(&my_LL); break; case 'h': printf( "a: add iVal\n" "b: back to beginning\n" "d: dump list to screen\n" "h: get help\n" "i: insert iVal\n" "n: next entry\n" "p: print current entry\n" "q: quit\n" "r: remove entry\n\n" ); break; case 'n': printf("Incrementing position.\n"); if(!ll_inc(&my_LL)) printf("At end of list.\n"); break; case 'i': scanf("%d", &val); pPayload = (int *) malloc(sizeof(int)); *pPayload = val; printf("Adding value %d to list.\n", *pPayload); ll_insert(&my_LL, pPayload); break; case 'r': if(ll_at_end(&my_LL)) printf("At end of list.\n"); else printf("Removing current entry.\n"); ll_remove(&my_LL); break; case 'q': ll_free(&my_LL); exit(1); default: printf("Unsupported command.\n"); break; } scanf("%c", &command); } return 0;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -