单向链表 = 数据域 + 指针域 以结构体的形式实现
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;
}