单向链表 = 数据域 + 指针域 以结构体的形式实现
typedef struct node{Data_type data;struct node *pnext;
}Link_node;
创建有头链表表头
Link_node *create_link()
{Link_node *pnode = malloc(sizeof(Link_node));if(NULL == pnode){return NULL;}pnode -> pnext = NULL;return pnode;
}
头插
int insert_head_link(Link_node *phead, Data_type data)
{Link_node *pnode = malloc(sizeof(Link_node));if(NULL == pnode){printf("fail malloc");return -1;}pnode -> data = data;pnode -> pnext = phead -> pnext;phead -> pnext = pnode;return 0;
}
尾插
int insert_tail_link(Link_node *phead,Data_type data)
{Link_node *p = NULL;Link_node *pnode = malloc(sizeof(Link_node));if(NULL == pnode){return -1;}pnode -> data = data;pnode -> pnext = NULL;p = phead;while(p->pnext != NULL){p = p->pnext;}p -> pnext = pnode;return 0;
}
头删
void delete_head_link(Link_node *phead)
{if(NULL == phead -> pnext){return;}Link_node *p = phead -> pnext;//p = p->pnext;phead -> pnext = p->pnext;free(p);
}
尾删
void delete_tail_link(Link_node *phead)
{ if(NULL == phead){return;}Link_node *p_pre = phead -> pnext;Link_node *p_del = p_pre-> pnext;while(NULL != p_del->pnext){p_pre = p_pre -> pnext;p_del = p_del -> pnext;}p_pre->pnext = NULL;free(p_del);
}
删除指定节点
void dele_appoint_link(Link_node *phead, int i)
{Link_node *p = phead;Link_node *p_del = phead -> pnext;int j = 1;while(i != j){p = p -> pnext;p_del = p_del -> pnext;++j;}p -> pnext = p -> pnext -> pnext;free(p_del);
}
倒序链表
void reverse_link(Link_node *phead)
{Link_node *p_temp = phead -> pnext;phead -> pnext = NULL;Link_node *p_insert = NULL;while(p_temp != NULL){p_insert = p_temp;p_temp = p_temp -> pnext;p_insert -> pnext = phead -> pnext;phead -> pnext = p_insert;}
}
单向链表的插入排序
void insert_sort_link(Link_node *phead)
{if(NULL == phead){return;}Link_node *p_temp = phead -> pnext -> pnext;phead -> pnext -> pnext = NULL;Link_node *p_insert = NULL;Link_node *p = NULL;while(p_temp != NULL){p_insert = p_temp;p_temp = p_temp -> pnext;p = phead;while(p -> pnext != NULL && p -> pnext->data < p_insert -> data){p = p -> pnext;}p_insert -> pnext = p -> pnext;p -> pnext = p_insert;}
}
销毁链表
void destory_link(Link_node *phead)
{//Link_node *p_current = phead->pnext;//Link_node *p_next;//Link_node *p = phead -> pnext;if(NULL == phead->pnext){printf("is Only\n");return;}while(phead->pnext != NULL){delete_head_link(phead);}free(phead);
}
查找中间节点(快慢指针)
Link_node *find_mid_link(Link_node *phead)
{if(NULL == phead){return NULL;}Link_node *p_fast = phead;Link_node *p_low = phead;while(p_fast != NULL){p_low = p_low -> pnext;p_fast = (p_fast -> pnext) -> pnext;}return p_low;
}
单向链表的遍历
void linkForeach(Link_node *phead)
{Link_node *p = phead -> pnext;for(p;p != NULL;p = p ->pnext){printf("%d\n",p->data);}
}
查找链表内容
Link_node *searchForlink(Link_node *phead,Data_type data_dest)
{Link_node *p = phead -> pnext;for(p;p != NULL;p = p ->pnext){if(data_dest == p->data){printf("Found %d\n",p -> data);return p;}}if(NULL == p){printf("Not Found\n");}return NULL;
}
根据查找情况修改内容
int modify_link(Link_node *phead,Data_type data_old,Data_type data_new)
{Link_node *pnode = searchForlink(phead, data_old);if(NULL != pnode){pnode -> data = data_new;return 0;}return -1;
}