13课选作1.
This commit is contained in:
154
13/Optional01.c
Normal file
154
13/Optional01.c
Normal file
@@ -0,0 +1,154 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user