双链表在功能上能够弥补单链表上的不可逆,查询上具有优势,我们下面将介绍双链表的搭建。
双链表结构体定义:
typedef struct DoubleLinklist
{
datatype data;
struct DoubleLinklist *plast;
struct DoubleLinklist *pnext;
}Dblink, *pDblink;
因为双链表是结构体中的指针连接起来的,所以创建链表的时候自然不能少了尾部添加节点的函数
pDblink adddataDblink(pDblink phead, datatype data) //双链表插入数据
{
Dblink *pnew = (Dblink*)malloc(sizeof(Dblink));
pnew->data = data;
pnew->pnext = NULL;
if (phead == NULL)
{
phead = pnew;
phead->plast = NULL;
}
else
{
Dblink*p = phead;
while (p->pnext!=NULL)
{
p = p->pnext;
}
p->pnext = pnew;
pnew->plast = p;
}
return phead;
}
接下来就可以创建双链表
Dblink *dblink = NULL;
dblink = adddataDblink(dblink, 20);
dblink = adddataDblink(dblink, 0);
dblink = adddataDblink(dblink, 21);
dblink = adddataDblink(dblink, 3);
dblink = adddataDblink(dblink, 56);
dblink = adddataDblink(dblink, 7);
dblink = adddataDblink(dblink, 1);
dblink = adddataDblink(dblink, 32);
dblink = adddataDblink(dblink, 5);
dblink = adddataDblink(dblink, 6);
创建完成不进行显示是不是不爽呢
void showDblink(Dblink*phead)
{
Dblink*p = phead;
while (p->pnext!=NULL)
{
printf("%d %p %p,%p\n", p->data, p, p->plast, p->pnext);
p = p->pnext;
}
printf("%d %p %p,%p\n", p->data, p, p->plast, p->pnext);
}
//调用显示
showDblink(dblink);
接下来是基本功能增删查改的实现
增
上面创建链表时候调用的`pDblink adddataDblink(pDblink phead, datatype data) 就实现了增加的功能。
删
pDblink deldata(pDblink phead, datatype data)
{
pDblink p = finddbdata(phead, data);
if (p == NULL)
{
return phead;
}
else if (p->pnext == NULL)
{
p->plast->pnext = NULL;
}
else if (p->plast == NULL)
{
p->pnext->plast = NULL;
phead = p->pnext;
}
else
{
p->plast->pnext = p->pnext;
p->pnext->plast = p->plast;
}
free(p);
return phead;
}
查
pDblink finddbdata(Dblink*phead, datatype data)
{
pDblink p = phead;
while (p->data != data && p->pnext != NULL)
{
p = p->pnext;
}
if (p->data!=data)
{
return NULL;
}
else
{
return p;
}
}
项目头文件
头文件声明 “linklist.h”
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
typedef int datatype;
struct linklist
{
datatype data;
struct linklist *pnext;
};
typedef struct linklist node;
typedef struct DoubleLinklist
{
datatype data;
struct DoubleLinklist *plast;
struct DoubleLinklist *pnext;
}Dblink, *pDblink;
node* adddata(node* phead, datatype data);
void showdata(node* phead);
void sortdata(node* phead, node* pback); //链表的快速排序法
int getnum(node*phead); //读取个数与反转
node* rev(node*phead);
void showcircel(node*phead); //环状链表
node *adddatacircel(node*phead, datatype data);
node* findcircle(node*phead, datatype data);
node* delcircle(node*phead, datatype data);
node* addsortdata(node*phead, datatype data); //链表插入排序
pDblink adddataDblink(pDblink phead, datatype data); //双链表
void showDblink(Dblink*phead);
pDblink finddbdata(Dblink*phead, datatype data);
pDblink deldata(pDblink phead, datatype data);
pDblink adddataDbcircellink(pDblink phead, datatype data); //双环链表
void showDbcircellink(Dblink*phead);
pDblink finddbcirceldata(Dblink*phead, datatype data);
pDblink delcirceldata(pDblink phead, datatype data);