#include #include #define LEN sizeof(NODE) typedef struct tagNode{ int index; int value; struct tagNode * prev; struct tagNode * next; } NODE; NODE* insert(NODE* head, int index, int value); NODE* delete_by_index(NODE* head, int index); NODE* create(int index, int value); void printOut(NODE* head); int main() { char command; int index, value; NODE* head = NULL; while (1) { printf("Type a command. (P)rint, (I)nsert, (D)elete, (Q)uit: "); fflush(stdin); scanf("%c", &command); fflush(stdin); switch (command) { case 'P': case 'p': printOut(head); break; case 'I': case 'i': printf("Index and value: "); scanf("%d %d", &index, &value); if (head == NULL) { head = create(index, value); } else { insert(head, index, value); } break; case 'D': case 'd': printf("Index: "); scanf("%d", &index); head = delete_by_index(head, index); break; case 'Q': case 'q': return 0; default: printf("Unkown command.\n"); } } return 0; } NODE* insert(NODE* head, int index, int value) { NODE* currentNode; NODE* newNodePtr; currentNode = head; if ((*currentNode).index > index) { newNodePtr = malloc(LEN); (*newNodePtr).index = index; (*newNodePtr).value = value; (*newNodePtr).prev = NULL; (*newNodePtr).next = currentNode; (*currentNode).prev = newNodePtr; return newNodePtr; } while((*currentNode).next != NULL) { if (index == (*currentNode).index) { (*currentNode).value = value; return currentNode; } if (index >= (*((*currentNode).next)).index) { currentNode = (*currentNode).next; continue; } newNodePtr = malloc(LEN); (*newNodePtr).index = index; (*newNodePtr).value = value; (*newNodePtr).prev = currentNode; (*newNodePtr).next = (*currentNode).next; (*(*currentNode).next).prev = newNodePtr; (*currentNode).next = newNodePtr; return newNodePtr; } newNodePtr = malloc(LEN); (*newNodePtr).index = index; (*newNodePtr).value = value; (*newNodePtr).prev = currentNode; (*newNodePtr).next = NULL; (*currentNode).next = newNodePtr; return newNodePtr; } NODE* create(int index, int value) { NODE* newNodePtr; newNodePtr = malloc(LEN); (*newNodePtr).index = index; (*newNodePtr).value = value; (*newNodePtr).prev = NULL; (*newNodePtr).next = NULL; return newNodePtr; } void printOut(NODE* head) { NODE current; if (head == NULL) { printf("(Empty list)\n"); return; } current = *head; while (1) { printf("Index: %d Value: %d\n", current.index, current.value); if (current.next == NULL) { break; } current = *(current.next); } } NODE* delete_by_index(NODE* head, int index) { NODE* current = head; NODE* newHead; if ((*current).index == index) { if ((*current).next != NULL) { (*((*current).next)).prev = NULL; } newHead = (*current).next; free(current); return newHead; } while ((*current).next != NULL) { if ((*current).index == index) { (*((*current).prev)).next = (*current).next; (*((*current).next)).prev = (*current).prev; free(current); return head; } current = (*current).next; } if ((*current).index == index) { if (((*current).prev) != NULL) { (*((*current).prev)).next = NULL; } newHead = (*current).prev; free(current); return newHead; } printf("No such node whose index is %d!\n", index); return head; }