结构体
typedef struct dblink
{
data_type data; // 数据域
struct dblink *pre;
struct dblink *next; // 指针域
}DbLink;
返回状态值的枚举
enum res
{
DBLINKNULL = -3,
MALLOCERROR,
POSERROR,
OK
};
相关函数说明
/*
* 功能:创建一个双链表
* 参数:无
* 返回值:链表的首地址,头结点的地址
*/
DbLink *createLink(void);
/*
* 功能:中间插入元素
* 参数1:链表的首地址
* 参数2:插入的位置pos
* 参数3:插入的数据元素
* 返回值:链表的首地址,头结点的地址
*/
int insertItemLink(DbLink *head, int pos, data_type item);
/*
* 功能:中间删除元素
* 参数1:链表的首地址
* 参数2:位置
* 参数3:保存要删除的元素
* 返回值:状态值
*/
int deleteItemLink(DbLink *head, int pos, data_type *pData);
/*
* 功能:显示链表所有的数据
* 参数:链表的首地址
* 返回值:状态值
*/
int showLink(DbLink *head);
/*
* 功能:销毁链表
* 参数:链表的首地址的地址
* 返回值:状态值
*/
int destoryLink(DbLink **head);
函数功能的具体实现
创建一个双链表的头结点
DbLink *createLink(void)
{
DbLink *head = NULL;
head = (DbLink *)malloc(sizeof(DbLink));
if(head == NULL)
{
perror("malloc error");
return NULL;
}
memset(head, 0, sizeof(DbLink));
return head;
}
插入结点
分为3种情况,其中pos
代表着要插入的位置(0代表头插,-1代表尾插,其余按照位置插入)
int insertItemLink(DbLink *head, int pos, data_type item)
{
if(head == NULL)
return MALLOCERROR;
if(pos < -1)
return POSERROR;
// 创建一个新的结点
DbLink *new = (DbLink *)malloc(sizeof(DbLink));
if(new == NULL)
{
perror("malloc error");
return MALLOCERROR;
}
memset(new, 0, sizeof(DbLink));
// 将数据传入new的数据域
new -> data = item;
DbLink *temp = NULL;
temp = head;
int i = 0;
switch(pos)
{
case HEAD: // 头插
if(temp -> next != NULL)
temp -> next -> pre = new;
new -> next = temp -> next;
new -> pre = temp;
temp -> next = new;
break;
case TAIL: // 尾插
while(1)
{
if(temp -> next == NULL)
break;
temp = temp -> next;
}
new -> next = temp -> next;
new -> pre = temp;
temp -> next = new;
break;
default: // 中间插入
{
for(i = 1; i < pos; i++)
{
if(temp -> next == NULL)
break;
temp = temp -> next;
}
new -> next = temp -> next;
new -> pre = temp;
if(new -> next != NULL)
new -> next -> pre = new;
temp -> next = new;
break;
}
}
return OK;
}
显示所有的结点数据
int showLink(DbLink *head)
{
if(head == NULL)
return MALLOCERROR;
if(head -> next == NULL)
return DBLINKNULL;
// 初始化一个游标指向头结点
DbLink *temp = head;
int i = 1;
while(temp -> next != NULL)
{
temp = temp -> next;
printf("└──%d号数据是:%d\n", i, temp -> data);
i++;
}
return OK;
}
删除结点
int deleteItemLink(DbLink *head, int pos, data_type *data)
{
if(head == NULL)
return MALLOCERROR;
if(head -> next == NULL)
return DBLINKNULL;
if(pos < -1)
return POSERROR;
DbLink *temp = head;
int i = 1;
switch(pos)
{
case HEAD: // 头删
temp = temp -> next;
*data = temp -> data;
temp -> pre -> next = temp -> next;
if(temp -> next != NULL)
temp -> next -> pre = temp -> pre;
free(temp);
break;
case TAIL: // 尾删
while(1)
{
temp = temp -> next;
if(temp -> next == NULL)
break;
}
*data = temp -> data;
temp -> pre -> next = temp -> next;
free(temp);
break;
default:
{
while(i <= pos)
{
// 未到达尾结点即可赋值
temp = temp -> next;
if(temp -> next == NULL)
{
// 到达尾结点
return deleteItemLink(head, -1, data);
}
i++;
}
*data = temp -> data;
// 前一个结点连接到后一个结点
temp -> pre -> next = temp -> next;
// 后一个结点连接到前一个结点
temp -> next -> pre = temp -> pre;
// 释放删除结点
free(temp);
break;
}
}
return OK;
}
销毁链表
int destoryLink(DbLink **head)
{
if(*head == NULL)
return MALLOCERROR;
if((*head) -> next == NULL)
return DBLINKNULL;
data_type data;
while(1)
{
deleteItemLink(*head, 0, &data);
if((*head) -> next == NULL)
break;
}
free(*head);
*head = NULL;
return OK;
}