📄 dulink.c
字号:
#include <stdio.h>
/*
#include <time.h>
#include <stdlib.h>
#include <string.h>
*/
#include "DuLink.h"
/*
带头结点的循环双链表的初始化
*/
void link_init(C_CLASS LINKLIST* link)
{
DUNODE* node;
link->THIS = link;
node = (DUNODE*)malloc(sizeof(DUNODE));
init_node(node); // 初始化首结点
link->head = node; // 头结点
link->rearptr = link->head;
link->count = 0;
link->insert_rear = link_insert_rear;
link->get_node_by_index = link_get_node_by_index;
link->get_node_by_key = link_get_node_by_key;
link->get_index_by_key = link_get_index_by_key;
link->delete_node_by_key = link_delete_node_by_key;
link->clear = link_clear;
link->del = link_del;
}
// 尾插法
void link_insert_rear(C_CLASS LINKLIST* link,void *data,int size)
{
DUNODE * pnode=create_node(data,size);
link->rearptr->next=pnode; // 最后一个 指向新的
pnode->prior=link->rearptr; //新的一个指向最后一个
// 循环 环节
pnode->next=link->head;
link->head->prior=pnode;
link->rearptr=pnode; // 新插入的结点为最后一个结点。尾插法特性
link->count++; // 结点计数器+1
}
/*
在双链表中返回第index个元素的地址,index=0 头结点,index 不存在 返回NULL地址
*/
DUNODE* link_get_node_by_index(C_CLASS LINKLIST* link,int index)
{
int i;
DUNODE * pnode=link->head; // p 指向头结点
if (0>index || index>link->count) // 看index的合法性
{
return NULL;
}
for(i=1;i<=index;i++)
{
pnode=pnode->next;
}
return pnode;
}
DUNODE* link_get_node_by_key(C_CLASS LINKLIST* link,char* key,int (*condition)(void *p1,void *p2))
{
//填写代码
DUNODE * pnode=link->head->next; // pnode 指向第一个结点
while (pnode!=link->head) // 指向头结点的时候 结束循环 说明找了一遍了
{
if ((*condition)(pnode->data,key)==0)
{
return pnode; // 找到返回 地址
}
pnode=pnode->next;
}
return NULL; // 没有找到返回空
}
int link_get_index_by_key(C_CLASS LINKLIST* link,char* key,int (*condition)(void *p1,void *p2))
{
DUNODE * pnode=link->head->next; // pnode 指向第一个结点
int pos=1;
while (pnode!=link->head) // 指向头结点的时候 结束循环 说明找了一遍了
{
if ((*condition)(pnode->data,key)==0)
{
return pos; // 找到返回 地址
}
pnode=pnode->next;
++pos;
}
//填写代码
return -1;
}
int link_delete_node_by_index(C_CLASS LINKLIST* link,int index)
{
//填写代码
int i;
DUNODE * pnode=link->head; // p 指向头结点
if (0>index || index>link->count) // 看index的合法性
{
return -1;
}
for(i=1;i<=index;i++)
{
pnode=pnode->next;
}
pnode->prior->next=pnode->next;
pnode->next->prior=pnode->prior;
if(index==link->count)
{
link->rearptr=pnode->prior;
}
free_node(pnode);
link->count--;
return i;
}
/*
删除满足条件的NODE
返货 INDEX 否则返回0
*/
int link_delete_node_by_key(C_CLASS LINKLIST* link,char* key,int (*condition)(void *p1,void *p2))
{
//填写代码
DUNODE * pnode=link->head->next; // 第一个结点
int pos=1;
while(pnode!=link->head)
{
if ((*condition)(pnode->data,key)==0)
{
pnode->prior->next=pnode->next;
pnode->next->prior=pnode->prior;
free_node(pnode);
link->count--;
return pos;
}
pnode=pnode->next;
}
return 0;
}
void link_clear(C_CLASS LINKLIST* link)
{
//填写代码
link->del(link);
free_node(link->head);
link->head=link->rearptr=NULL;
link->count=0;
}
/*
删除所有结点不包括头结点
*/
void link_del(C_CLASS LINKLIST* link)
{
//填写代码
DUNODE * q,* pDelnode=link->head->next; // 指向第一个结点并非头结点
while (pDelnode!=link->head) // 当pDelnode 指向头结点时候,说明已经删除玩了
{
q=pDelnode->next;
free_node(pDelnode);
pDelnode=q;
}
link->rearptr=link->head; // 指向 头结点
link->head->next=link->head->prior=link->head; // 空循环双链表时候,头结点的前驱后继指针指向自己
link->count=0;
}
void init_node(DUNODE* n)
{
//填写代码
n->next=n->prior=n; // 初始化结点
n->data=NULL;
}
DUNODE* create_node(void *data,int size)
{
//填写代码
DUNODE * pnode=(DUNODE *)malloc(sizeof(DUNODE));
void * pdata=(void *)malloc(size);
if (!pnode || !pdata)
{
printf("申请内存失败,程序结束!");
exit(0);
return NULL;
}
init_node(pnode);
memcpy(pdata,data,size);
pnode->data=pdata;
return pnode;
}
void free_node(DUNODE *n)
{
//填写代码
free(n->data);
free(n);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -