#include <stdio.h>
#include <stdlib.h>
typedef int DATA;
typedef struct node {
struct node *next;
DATA data;
} NODE;
NODE list_head;
void addNewNodeToHeadLocal(struct node *root, int data, int pos) {
NODE *newNode;
if (root->next == 0 || pos <= 0) {
if ((newNode = malloc(sizeof(NODE))) != 0) {
newNode->next = root->next;
root->next = newNode;
newNode->data = data;
}
} else {
addNewNodeToHeadLocal(root->next, data, pos - 1);
}
}
void addNewNodeToHead(DATA *data, int pos) {
addNewNodeToHeadLocal(&list_head, (*data)++, pos - 1);
}
void deleteFirstNodeLocal(struct node *root, int pos) {
NODE *prevNode;
if (pos <= 0) {
if (root->next) {
prevNode = root->next;
root->next = prevNode->next;
free(prevNode);
} else {
printf("list is empty\n");
}
} else {
if (root->next)
deleteFirstNodeLocal(root->next, pos - 1);
else
deleteFirstNodeLocal(root, pos - 1);
}
}
void deleteFirstNode(int pos) {
deleteFirstNodeLocal(&list_head, pos - 1);
}
void showList(void) {
NODE *pos;
pos = list_head.next;
while ( pos != NULL ) {
printf("%d ", pos->data);
pos = pos->next;
}
printf("\n\n");
}
int main() {
int key, pos;
DATA value;
value = 1;
list_head.next = NULL;
while (key != 9) {
showList();
printf("1.add to top of list,2.delete from top of list,9.quit:");
scanf("%d",&key);
switch (key) {
case 1:
printf("the position from top where data to insert: ");
scanf("%d",&pos);
addNewNodeToHead(&value, pos);
break;
case 2:
printf("the position from top where data to delete: ");
scanf("%d",&pos);
deleteFirstNode(pos);
break;
default:
break;
}
}
while (list_head.next)
deleteFirstNode(0);
return 0;
}
/* end */