#include "double_list.h"
// 初始化函数
void list_init(list_t* list){
list->head.data = 0 ;
list->head.prev = NULL;
list->head.next = &list->tail;
list->tail.prev = &list->head;
list->tail.data =0;
list->tail.next = NULL;
}
int list_empty(list_t *list){
return list->head.next==&list->tail ? 1:0; // 表达式? 成立:不成立
}
int list_size(list_t *list){
int i = 0 ;
for(node_t *pnode = &list->head;pnode != &list->tail;pnode = pnode->next)
{
node_t *pfirst = pnode ;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid != &list->tail)
i++;
}
return i;
}
static node_t* create_node(int data){
node_t *pnew = (node_t *)malloc(sizeof(node_t));
pnew->prev = NULL;
pnew->data = data;
pnew->next = NULL;
return pnew;
}
static void insert_node(node_t* pfirst,node_t *pnew,node_t* pmid){
pnew->next = pmid;
pmid->prev =pnew;
pfirst->next = pnew;
pnew->prev = pfirst;
}
// 顺序插入
void list_add(list_t *list,int data){
node_t *pnew = create_node(data);
for(node_t *pnode = &list->head; pnode != &list->tail; pnode = pnode->next)
{
node_t *pfirst = pnode ;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid->data >= data|| pmid ==&list->tail)
{
insert_node(pfirst,pnew,pmid);
break;
}
}
}
void list_addfirst (list_t *list,int data){
// 1.先创建新节点
node_t *pnew = create_node(data);
// 2.造两个游标
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
// 3.插入节点
insert_node(pfirst ,pnew,pmid);
}
void list_addend (list_t *list,int data){
node_t *pnew = create_node(data);
node_t *pmid = &list->tail;
node_t *pfirst = pmid->prev;
insert_node(pfirst,pnew,pmid);
}
static void del_node(node_t *pfirst ,node_t *pmid,node_t *plast){
pfirst->next = plast ; // 头指向尾
plast->prev = pfirst; // 尾指向头
free(pmid); // 删除中间
}
void list_delnode(list_t *list,int data){
for(node_t *pnode = &list->head;
pnode != &list->tail; pnode= pnode->next)
{
node_t *pfirst = pnode;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid->data == data&& pmid!= &list->tail){
del_node(pfirst,pmid,plast);
break;
}
}
}
void list_del_first(list_t *list){
if(list_empty(list))
{
printf("链表空了\n");
return ;
}
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
del_node(pfirst,pmid,plast);
}
void list_del_end(list_t *list){
if(list_empty(list))
{
printf("链表空了\n");
return ;
}
node_t *pfirst = (&list->tail)->prev->prev;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
del_node(pfirst,pmid,plast);
}
int list_get(list_t *list,int index){
// 先判断 index是否合理
if(index > list_size(list)){
printf("无效index\n");
return -1;
}
int count = 0;
for(node_t *pnode = &list->head;
pnode != &list->tail; pnode= pnode->next)
{
node_t *pfirst = pnode;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(index == count && pmid != &list->tail){
return pmid->data;
}
count++;
}
}
void list_deinit(list_t *list){
while(list->head.next!= &list->tail){
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
del_node(pfirst,pmid,plast);
}
} // 不包括头节点和尾节点
评论0