初始化链表
LinkNode* CreateNode(LinkType x){
LinkNode* ptr = (LinkNode*)malloc(sizeof(x));
ptr -> value = x;
ptr ->next = NULL;
return ptr;
}
创建一个新结点
void LinkInit(LinkNode** head){
if(head == NULL){
return;
}
*head = NULL;
}
销毁一个结点
void DestroyNode(LinkNode* ptr){
free(ptr);
}
尾插
void LinkPushBack(LinkNode** head,LinkType x){
if(head == NULL){
return;
}
if(*head == NULL){
*head = CreateNode(x);
}else{
LinkNode* cur = *head;
while(cur->next != NULL){
cur = cur->next;
}
LinkNode* newnode = CreateNode(x);
cur->next = newnode;
}
}
尾删
void LinkPopBack(LinkNode** head){
if(head == NULL || *head == NULL){
return;
}
LinkNode* pos = *head;
while(pos->next->next != NULL){
pos = pos->next;
}
DestroyNode(pos->next);
pos->next = NULL;
}
头插
void LinkPushFront(LinkNode** head,LinkType x){
if(head == NULL){
return;
}
LinkNode* newnode = CreateNode(x);
if(*head == NULL){
*head = newnode;
}else{
newnode->next = (*head);
}
*head = newnode;
}
头删
void LinkPopFront(LinkNode** head){
if(head == NULL || *head == NULL){
return;
}
LinkNode* ptr = *head;
*head = (*head)->next;
DestroyNode(ptr);
}
查找链表中某字符的位置
LinkNode* LinkFind(LinkNode** head,LinkType x){
if(*head == NULL || head == NULL){
return;
}
LinkNode* ptr = *head;
while((ptr->value != x) && (ptr != NULL)){
ptr = ptr->next;
}
if(ptr->value == x){
return ptr;
}else{
return NULL;
}
}
在指定位置的前面插入
void LinkInsertBeforePos(LinkNode* head,LinkNode* pos,LinkType x){
if(head == NULL){
return;
}
LinkNode* ptr = head;
LinkNode* newnode = CreateNode(x);
while(ptr->next != pos){
ptr = ptr->next;
}
newnode->next = pos;
ptr->next = newnode;
}
在指定位置的后面插入
void LinkInsertAfterPos(LinkNode* head,LinkNode* pos,LinkType x){
if(head == NULL){
return;
}
LinkNode* newnode = CreateNode(x);
LinkNode* ptr = head;
while(ptr != pos){
ptr = ptr->next;
}
newnode->next = ptr->next;
ptr->next = newnode;
}
删除指定位置
void LinkDeletePos(LinkNode* head,LinkNode* pos){
if(head == NULL){
return;
}
LinkNode* pos_prev = head;
while(pos_prev->next != pos){
pos_prev = pos_prev->next;
}
LinkNode* pos_next = pos->next;
pos_prev->next = pos_next;
DestroyNode(pos);
}
删除指定值
void LinkDeleteValue(LinkNode* head,LinkType to_delete){
if(head == NULL){
return;
}
if(head->value == to_delete){
LinkPopFront(&head);
return;
}
LinkNode* prev = head;
while(prev->next->value != to_delete){
prev = prev->next;
}
if(prev->next->next == NULL){
LinkPopBack(&head);
}else{
LinkNode* todelete = prev->next;
LinkNode* posnext = prev->next->next;
prev->next = posnext;
DestroyNode(todelete);
}
}
删除指定的所有值
void LinkDeleteValueAll(LinkNode* head,LinkType to_delete){
if(head == NULL){
return;
}
if(head->value == to_delete){
LinkPopFront(&head);
return;
}
LinkNode* prev = head;
while(prev->next->value != to_delete){
prev = prev->next;
}
if(prev->next->next == NULL){
LinkPopBack(&head);
return;
}else{
LinkNode* todelete = prev->next;
LinkNode* posnext = prev->next->next;
prev->next = posnext;
DestroyNode(todelete);
LinkDeleteValueAll(posnext,to_delete);
}
}
链表逆置
void Reverse(LinkNode** head){
LinkNode* prev;
LinkNode* middle = *head;
LinkNode* next = (*head)->next;
while(middle != NULL){
if(next == NULL){
middle->next = prev;
*head = middle;
break;
}
middle->next = prev;
prev = middle;
middle = next;
next = next->next;
}
}
在指定位置前插入值(不遍历链表)
void InsertBefore(LinkNode** head,LinkNode* pos,LinkType x){
if(head == NULL){
return;
}
LinkNode* newnode = CreateNode(x);
if((*head)->next == NULL){
newnode->next = (*head);
(*head) = newnode;
}else{
LinkNode* pos_next = pos->next;
Swap(newnode,pos);
pos->next = newnode;
newnode->next = pos_next;
}
}