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

📄 llist2.c

📁 一个很好的分子动力学程序
💻 C
字号:
/*llist2.c - A special implementation of a dynamically allocated linked list.Created By:  David G. ClarkLast Modified:  06/23/97*/#include <stdio.h>#include <stdlib.h>#include "llist2.h"/*Define Switches*//*#define L_LIST_TEST_DRIVER*//*Function Definitions*/void InitList(LinkList_t *list){	list->Head = NULL;	list->Tail = NULL;	list->Error = NoErr;	list->Closed = FALSE;	return;}BOOLEAN IsListError(LinkList_t list){	if (list.Error == NoErr)		return(FALSE);	else return(TRUE);}void PrintListError(FILE *output, LinkList_t list){	switch (list.Error) {		case MemErr :			fprintf(output, "\nMemErr:  Not enough memory to allocate new node.");			break;		case NullErr :			fprintf(output, "\nNullErr:  No such list exists.");			break;		case ClosedErr :			fprintf(output, "\nClosedErr:  The list is closed.");		default :			fprintf(output, "\nNoErr:  There are no problems with the list.");			break;	}	return;}BOOLEAN AddNodeToList(LinkList_t *list, InfoType_t pos, long step){	Link_t NewNode;	/* Make sure list isn't closed. */	if (list->Closed == TRUE) {		list->Error = ClosedErr;		return(FALSE);	}	/* Allocate memory for new node if possible. */	NewNode = (Link_t) malloc(sizeof(ListNode_t));	if (NewNode == NULL) {		list->Error = MemErr;		return(FALSE);	}	/* Set data in new node and update list. */	NewNode->Mark = pos;	NewNode->Step = step;	NewNode->Next = NULL;	if (list->Head == NULL) {		NewNode->Prev = NULL;		list->Head = NewNode;		list->Tail = NewNode;	}	else {		NewNode->Prev = list->Tail;		list->Tail->Next = NewNode;		list->Tail = NewNode;	}	return(TRUE);}BOOLEAN RemLastNodeFromList(LinkList_t *list){	Link_t LastNode;		/* Make sure list isn't closed. */	if (list->Closed == TRUE) {		list->Error = ClosedErr;		return(FALSE);	}	/* Make sure list isn't empty. */	if (list->Tail == NULL) {		list->Error = NullErr;		return(FALSE);	}	/* Delete mention of last node from list. */	LastNode = list->Tail;	list->Tail = LastNode->Prev;	list->Tail->Next = NULL;	/* Free memory used by last node. */	free(LastNode);	return(TRUE);}BOOLEAN RemFirstNodeFromList(LinkList_t *list){	Link_t FirstNode;	/* Make sure list isn't closed. */	if (list->Closed == TRUE) {		list->Error = ClosedErr;		return(FALSE);	}	/* Make sure list isn't empty. */	if (list->Head == NULL) {		list->Error = NullErr;		return(FALSE);	}	/* Delete mention of first node from list. */	FirstNode = list->Head;	list->Head = FirstNode->Next;	list->Head->Prev = NULL;	/* Free memory used by first node. */	free(FirstNode);	return(TRUE);}int ListLength(LinkList_t list){	Link_t CurNode;	int Length;	if (list.Head == NULL)		return(0);	Length = 1;	CurNode = list.Head;	while (CurNode != list.Tail) {		Length += 1;		CurNode = CurNode->Next;	}		return(Length);}void PrintList(FILE *output, LinkList_t list){	Link_t CurNode;		CurNode = list.Head;	while (CurNode != list.Tail) {		fprintf(output, "\n%d %ld", CurNode->Mark, CurNode->Step);		CurNode = CurNode->Next;	}	if (list.Tail != NULL)		fprintf(output, "\n%d %ld", list.Tail->Mark, list.Tail->Step);	return;}	void FreeList(LinkList_t *list){	Link_t CurNode;	/* Make sure list isn't closed. */	OpenList(list);	/* Parse through list and free each node. */	while (list->Head != NULL) {		CurNode = list->Head;		list->Head = CurNode->Next;		free(CurNode);	}	return;}void CloseList(LinkList_t *list){	if (list->Closed == TRUE)		return;	if (list->Head == NULL) {		list->Closed = TRUE;		return;	}	list->Head->Prev = list->Tail;	list->Tail->Next = list->Head;	list->Closed = TRUE;	return;}void OpenList(LinkList_t *list){	if (list->Closed == FALSE)		return;	if (list->Head == NULL) {		list->Closed = FALSE;		return;	}		list->Head->Prev = NULL;	list->Tail->Next = NULL;	list->Closed = FALSE;	return;}/*Test Driver*/#ifdef L_LIST_TEST_DRIVERint main(){	LinkList_t List;	int i;	int j;		InitList(&List);	PrintListError(stdout, List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print the NoErr message, and length=0.");	for (i=0; i<10; ++i) {		if (AddNodeToList(&List, i, i) == FALSE)			PrintListError(stdout, List);	}	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Shouldn't give any errors, and length=10.");	if (RemLastNodeFromList(&List) == FALSE)		PrintListError(stdout, List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print length=9.");	if (RemFirstNodeFromList(&List) == FALSE)		PrintListError(stdout, List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print length=8.");		CloseList(&List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print length=8.");	OpenList(&List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print length=8.");	for (i=10; i<15; ++i) {		if (AddNodeToList(&List, i, i) == FALSE)			PrintListError(stdout, List);	}	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Shouldn't give any errors, and length=13.");	PrintList(stdout, List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print numbers 1-8, 10-14, and length=13.");	FreeList(&List);	printf("\nList length=%d.", ListLength(List));	printf("---Note:  Should print length=0.");		printf("\n\n");	return;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -