154 lines
4.1 KiB
C
154 lines
4.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#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;
|
|
} |