单向链表只能往下一个找
双向链表可以找上一个
创建双向链表的头
Dou_node *creat_doulink()
{
Dou_node *pnode = malloc(sizeof(Dou_node));
if(NULL == pnode)
{
printf("fail malloc\n");
return NULL;
}
pnode -> pper = NULL;
pnode -> pnext = NULL;
return pnode;
}
int is_empty_doulink(Dou_node *phead)//判断链表是否为空
{
if(NULL == phead -> pnext)
{
return 1;
}
return 0;
}
头插
int insert_head_doulink(Dou_node *phead,Data_type data)
{
Dou_node *pinsert = malloc(sizeof(Dou_node));
if(NULL == pinsert)
{
printf("fail malloc");
return -1;
}
pinsert -> data = data;
pinsert -> pper = NULL;
pinsert -> pnext = NULL;
if(is_empty_doulink(phead))
{
phead -> pnext = pinsert;
pinsert -> pper = phead;
}
else
{
pinsert -> pnext = phead -> pnext;
phead -> pnext -> pper = pinsert;
phead -> pnext = pinsert;
pinsert -> pper = phead;
}
return 0;
}
尾插
int insert_tail_doulink(Dou_node *phead,Data_type data)
{
Dou_node *p = NULL;
Dou_node *pnode = malloc(sizeof(Dou_node));
if(NULL == pnode)
{
printf("fail malloc");
return -1;
}
pnode -> data = data;
pnode -> pper = NULL;
pnode -> pnext = NULL;
if(is_empty_doulink(phead))
{
phead -> pnext = pnode;
pnode -> pper = phead;
}
else
{
p = phead;
while(p -> pnext)
{
p = p -> pnext;
}
p -> pnext = pnode;
pnode -> pper = p;
}
return 0;
}
遍历
void printfdoulink(Dou_node *phead)
{
Dou_node *p = phead -> pnext;
while(p)
{
printf("%d %s %d\n",p -> data.id,p -> data.name,p -> data.score);
p = p -> pnext;
}
}
Dou_node *finddoulink(Dou_node *phead,int id)
{
Dou_node *p = phead -> pnext;
while(p)
{
if(p -> data.id == id)
{
return p;
}
p = p -> pnext;
}
return NULL;
}
修改
void changedoulink(Dou_node *phead, int id,int score)
{
Dou_node *p = phead -> pnext;
if(p = finddoulink(phead,id))
{
p -> data.score = score;
return;
}
else
{
printf("not find and change\n");
}
return;
}