⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dulink.c

📁 linux环境下结合ncurse库
💻 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 + -