Files
BasicsOfComputerSoftwareEng…/POP/13/Optional01.c
2023-02-21 10:56:54 +08:00

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;
}