#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
typedef int ElemType;
typedef struct LNode {
ElemType val;
struct LNode *next;
} LNode, *LinkList;
void construct_link_list(LinkList *list, bool with_head, int range);
void traverse_link_list(LinkList *list);
bool insert_with_head(LinkList *list, int index, ElemType val);
bool insert_without_head(LinkList *list, int index, ElemType val);
int main() {
LinkList list_with_head, list_without_head;
construct_link_list(&list_with_head, 1, 10);
construct_link_list(&list_without_head, 0, 10);
traverse_link_list(&list_with_head);
traverse_link_list(&list_without_head);
putchar(10);
insert_with_head(&list_with_head, 1, 10);
insert_without_head(&list_without_head, 1, 10);
traverse_link_list(&list_with_head);
traverse_link_list(&list_without_head);
return 0;
}
void construct_link_list(LinkList *list, bool with_head, int range) {
LinkList val_start_node, val_end_node, node;
node = (LinkList) malloc(sizeof(LNode));
node->val = 0;
val_start_node = node;
val_end_node = node;
for (int i = 1; i < range; i++) {
node = (LinkList) malloc(sizeof(LNode));
node->val = i;
node->next = NULL;
val_end_node->next = node;
val_end_node = node;
}
if (with_head) {
LinkList head = (LinkList) malloc(sizeof(LNode));
head->val = -1;
*list = head;
head->next = val_start_node;
} else {
*list = val_start_node;
}
}
void traverse_link_list(LinkList *list) {
LinkList iter = *list;
while (iter != NULL) {
if (iter->val == -1) {
iter = iter->next;
continue;
}
printf("%d ", iter->val);
iter = iter->next;
}
putchar(10);
}
bool insert_with_head(LinkList *list, int index, ElemType val) {
if (*list == NULL) {
return false;
}
LinkList iter = *list;
int j = 0;
while (iter != NULL && j < index - 1) {
iter = iter->next;
j++;
}
if (iter == NULL) {
return false;
}
LinkList node = (LinkList) malloc(sizeof(LNode));
node->val = val;
node->next = iter->next;
iter->next = node;
return true;
}
bool insert_without_head(LinkList *list, int index, ElemType val) {
if (index == 1) {
LinkList node = (LinkList) malloc(sizeof(LNode));
node->val = val;
node->next = *list;
*list = node;
return true;
}
LinkList iter = *list;
int j = 1;
while (iter != NULL && j < index - 1) {
iter = iter->next;
j++;
}
if (iter == NULL) {
return false;
}
LinkList node = (LinkList) malloc(sizeof(LNode));
node->val = val;
node->next = iter->next;
iter->next = node;
return true;
}