⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e_ll.c

📁 对于研究FPGA结构的人来说
💻 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 + -