📄 llist2.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 + -