一、基本知识
1、两个指针,可以通过任意一个结点找到其前一个结点和后一个结点
二、基本操作
2.1、创建一个双向链表
Dlink_t *Create_doublelink()
{
Dlink_t *pdoulink = malloc(sizeof(Dlink_t));
if(pdoulink == NULL)
{
return NULL;
}
pdoulink->phead = NULL;
pdoulink->clen = 0;
pthread_mutex_init(&(pdoulink->mutex),NULL);
return pdoulink;
}
2.2、头插
nt push_doublelink(Dlink_t *dblink,Stu_t data)
{
Dlink_node_t *dbnode = malloc(sizeof(Dlink_node_t));
if(dbnode == NULL)
{
perror("fail dbnode");
return -1;
}
dbnode->data = data;
dbnode->pperv = NULL;
dbnode->pnext = NULL;
if(is_empty_doublelink(dblink))
{
dblink->phead = dbnode;
}
else
{
dbnode->pnext = dblink->phead;
dblink->phead->pperv = dbnode;
dblink->phead = dbnode;
}
dblink->clen++;
return 0;
}
2.3、尾插
int push_tail_doublelink(Dlink_t *dblink,Stu_t data)
{
Dlink_node_t *dbnode = malloc(sizeof(Dlink_node_t));
if(dbnode == NULL)
{
perror("fail dbnode");
return -1;
}
dbnode->data = data;
dbnode->pperv = NULL;
dbnode->pnext = NULL;
Dlink_node_t *dnode = dblink->phead;
if(is_empty_doublelink(dblink))
{
dblink->phead = dbnode;
}
else
{
while(dnode->pnext != NULL)
{
dnode = dnode->pnext;
}
dnode->pnext = dbnode;
dbnode->pperv = dnode;
}
}
2.4、头删
int delete_head_doublelink(Dlink_t *dblink)
{
if(is_empty_doublelink(dblink))
{
return -1;
}
Dlink_node_t *dbnode = dblink->phead;
dblink->phead = dbnode->pnext;
if(dbnode->pnext != NULL)
{
dbnode->pnext->pperv = NULL;
}
free(dbnode);
dblink->clen--;
return 0;
}
2.5、尾删
int delete_tail_doublelink(Dlink_t *dblink)
{
if(is_empty_doublelink(dblink))
{
return -1;
}
Dlink_node_t *dnode = dblink->phead;
while(dnode->pnext != NULL)
{
dnode = dnode->pnext;
}
if(donde->pperv != NULL)
{
dnode->pperv->pnext = NULL;
}
free(dnode);
dblink->clen--;
return 0;
}
2.6、查询
Dlink_node_t *select_doublelink(Dlink_t *dblink,Stu_t data)
{
if(is_empty_doublelink(dblink))
{
return NULL;
}
Dlink_node_t *dnode = dblink->phead;
while(!strcmp(dnode->data.name,data.name))
{
dnode =dnode->pnext;
}
return dnode;
}
2.7、修改
}
Dlink_node_t *alter_doublelink(Dlink_t *dblink,Stu_t data,char *p)
{
Dlink_node_t *q = select_doublelink(dblink,data);
strcpy(q->data.name,p);
return q;
}
2.8、销毁
int destory_doublelink(Dlink_t *dblink)
{
if(is_empty_doublelink(dblink))
{
return -1;
}
Dlink_node_t *pnode = NULL;
Dlink_node_t *p = NULL;
while(dblink->phead != NULL)
{
pnode = dblink->phead;
dblink->phead = pnode->pnext;
cc
}
free(dblink);
return 0;
}
注意
在销毁的时候,要需注意在此用的是头删,我们需要考虑,头删的结点,的下一个结点是否存在,也就是说特列是只有一个结点,如果不考虑会造成指针越界
2.9、遍历
void doulink_for_each(DLink_t *pdoulink, int dir)
{
if (is_empty_doulink(pdoulink))
return;
DLink_Node_t *p = pdoulink->phead;
if (dir)
{
while (p != NULL)
{
printf("%d %s %d\n", p->data.id, p->data.name, p->data.score);
p = p->pnext;
}
}
else
{
while (p->pnext != NULL)
{
p = p->pnext;
}
while (p != NULL)
{
printf("%d %s %d\n", p->data.id, p->data.name, p->data.score);
p = p->ppre;
}
}
printf("\n");
}