`
heglase
  • 浏览: 3319 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

双链表

 
阅读更多
#ifndef _LINK_NODE_
#define _LINKE_NODE_

typedef struct Node {

  struct Node* pNext;
  struct Node* pPrevious;
  void* pData;

} NodeStruct, *pNodeStruct;




typedef struct SingleLinkedList {

  pNodeStruct pHead;

  pNodeStruct pTail;

} SingleLinkedListStruct, *pSingleLinkedListStruct;

typedef int (*CompareFunc)(void*,void*)  ;

void init(pSingleLinkedListStruct*);
void destory(pSingleLinkedListStruct*);
void display(pSingleLinkedListStruct);
void insertFront(pSingleLinkedListStruct*,void*);
void insertTail(pSingleLinkedListStruct*,void*);
pNodeStruct* findData(pSingleLinkedListStruct*,void*,CompareFunc);
void deleteNode(pSingleLinkedListStruct*,void*,CompareFunc);
 
int cmp(void* a,void* b)
{
	int* pa=(int*)a;
	int* pb=(int*)b;
	if((*pa)==(*pb))
	{
		return 1;
	}else 
		return 0;
}
#endif

 

 

 

#include <stdio.h>
#include <malloc.h>
#include "link.h"


int main()
{
	int a=90,b=80,c=20,d=2,e=2;
	pSingleLinkedListStruct pt=(pSingleLinkedListStruct)malloc(sizeof(SingleLinkedListStruct));
	init(&pt);
 
	insertFront(&pt,&a);//前增
	insertFront(&pt,&b);
	insertFront(&pt,&c);
	 insertTail(&pt,&d);//后增
	//pNodeStruct* p1=findData(&pt,&e,cmp);//查找,返回找到的地址;
	//int* t=(int*)(*p1)->pPrevious->pData;
	//printf("%d\n",(*t));//打印查找到的值
 
printf("------删除前--------\n");	
	display(pt);
	deleteNode(&pt,&a,cmp);//删除调用的查找的方法
	 
printf("------删除后--------\n");		
	display(pt);


	destory(&pt);
	 
    return 0;
}


 
void init(pSingleLinkedListStruct* ps)
{
	(*ps)->pHead=NULL;
	(*ps)->pTail=NULL;
}




void display(pSingleLinkedListStruct p)
{
	pNodeStruct currentNode=p->pHead;
	while(currentNode)
	{
		printf("%d\n",*(int*)(currentNode->pData));
		currentNode=currentNode->pNext;
	}
}

void insertFront(pSingleLinkedListStruct* p,void* data)
{
        pNodeStruct currentNode=(pNodeStruct)malloc(sizeof(NodeStruct));
		currentNode->pData=data;
        if((*p)->pHead==NULL)
        {
			currentNode->pNext=NULL;
			currentNode->pPrevious=NULL;
			(*p)->pHead=currentNode;
			(*p)->pTail=currentNode;

        }
		else
		{
			currentNode->pNext=(*p)->pHead;
			(*p)->pHead->pPrevious=currentNode;
			(*p)->pHead=currentNode;
		}
}

void insertTail(pSingleLinkedListStruct* p,void* data)
{
	pNodeStruct currentNode=(pNodeStruct)malloc(sizeof(NodeStruct));
	currentNode->pData=data;
	if((*p)->pTail==NULL)
	{
			currentNode->pNext=NULL;
			currentNode->pPrevious=NULL;
			(*p)->pHead=currentNode;
			(*p)->pTail=currentNode;
	}
	else
	{
			currentNode->pNext=NULL;
			currentNode->pPrevious=(*p)->pTail;
			(*p)->pTail->pNext=currentNode;
			(*p)->pTail=currentNode;
	}

}


pNodeStruct* findData(pSingleLinkedListStruct* p,void* data,CompareFunc compar)
{
	pNodeStruct cp=(*p)->pHead;
	while(cp)
	{
		if(compar(cp->pData,data))
		{
			 
			return &cp;
		}
		cp=cp->pNext;
	}
	return NULL;

}

//之前单链表的方式是记住前一个节点。双链表不需要记住前一个节点
void deleteNode(pSingleLinkedListStruct* p,void* data,CompareFunc compar)
{
	pNodeStruct* searchNode=findData(p,data,cmp);//调用查找方法
	if(searchNode==NULL)
		return;
	if((*searchNode)==(*p)->pHead)
	{
		(*p)->pHead=(*p)->pHead->pNext;
		(*p)->pHead->pPrevious=NULL;
		printf("头结点要被删掉了\n");
		 
	}else if((*searchNode)==(*p)->pTail)
	{	
		(*p)->pTail=(*p)->pTail->pPrevious;
		(*p)->pTail->pNext=NULL;
		printf("尾结点要被删掉了\n");
		 

		
	}else
	{
		 (*searchNode)->pPrevious->pNext=(*searchNode)->pNext;
		(*searchNode)->pNext->pPrevious=(*searchNode)->pPrevious;
	}
	
	 
}

void destory(pSingleLinkedListStruct* p)
{
	pNodeStruct cp=(*p)->pHead;
	if((*p)->pHead!=NULL)
	{
		cp=(*p)->pHead->pNext;
		free((*p)->pHead);
		(*p)->pHead=cp;
	}
}

 

分享到:
评论

相关推荐

    数据结构的双链表算法

    双链表是数据结构中的一种重要类型,它在计算机科学中有着广泛的应用。与单链表相比,双链表的特点在于每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针,这使得双向操作更加便捷。 在双链表...

    支持类模版的C++双向链表

    在C++编程中,双向链表是一种非常重要的数据结构,它允许在列表的任一位置进行插入和删除操作,而不必像数组那样依赖于索引。在这个“支持类模版的C++双向链表”中,我们将探讨如何利用C++的模板特性来实现一个灵活...

    双向链表双向链表双向链表

    双向链表是一种高级数据结构,它在计算机科学中被广泛应用于各种算法和程序设计中。与单链表相比,双向链表的主要特点是每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针。这种设计使得双向...

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    C++双向链表统计文章单词出现频率

    在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...

    Linux内核双向链表简单分析

    其中,双向链表(双链表)不仅支持向后指针,还支持向前指针,这使得双向链表在操作上更为灵活,特别是在需要频繁进行反向遍历的情况下。 #### list链表组织结构 在Linux内核中,双向链表的实现主要依赖于`struct ...

    用双向链表做的n的阶乘

    在编程领域,双向链表是一种数据结构,它允许在列表中的元素之间进行前向和后向的导航。这种数据结构在处理需要频繁插入、删除或遍历操作的问题时特别有用。而“n的阶乘”是数学概念,表示1到n的所有整数的乘积,记...

    双向链表的操作

    双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...

    创建双向链表_双向链表_

    双向链表是一种特殊类型的数据结构,与常见的单向链表相比,它具有更丰富的操作能力,可以支持前后两个方向的遍历。本篇文章将深入探讨如何创建双向链表以及其在增加和删除操作中的应用。 双向链表的每个节点不仅...

    操作系统课设-线程安全的双向链表

    操作系统课程设计中实现线程安全的双向链表是一项重要的实践任务,这涉及到多线程编程、数据结构以及并发控制等核心知识点。在这个项目中,我们主要关注如何在多线程环境下构建一个能够正确操作(如插入、删除)而不...

    双向链表的增删改查

    在计算机科学中,数据结构是组织和管理数据的重要方式,而链表作为一种基本的数据结构,被广泛用于各种算法和程序设计中。双向链表(Double Linked List)是链表的一种变体,它允许我们在列表中的每个节点处进行前向...

    数据结构-双向链表

    双向链表是一种特殊的数据结构,它在编程中具有重要的应用。本文将深入探讨双向链表的概念,实现,以及如何进行基本操作。 双向链表,顾名思义,是一种链式存储结构,其中每个节点包含两个指针,一个指向前一个节点...

    双向链表模板类简单实现

    在编程领域,数据结构是构建复杂算法的基础,而链表作为一种基本的数据结构,常常被用于解决各种问题。本文将深入探讨双向链表及其在C++中的模板类实现,以"双向链表模板类简单实现"为主题,我们来详细了解一下这个...

    单链表、双链表、循环链表的操作

    链表可以分为单链表、双链表和循环链表三种,下面我们将详细介绍这些链表的操作。 单链表 单链表是一种基本的链表结构,其中每个节点只有一个指针指向下一个节点。单链表的实现可以通过结构体来实现,如上面的代码...

    数据结构源代码之双向链表

    ### 数据结构源代码之双向链表 #### 概述 本文档主要介绍如何通过C语言实现双向链表的基本操作。继单链表之后,双向链表作为一种更灵活的数据结构,支持从前向后以及从后向前的遍历。双向链表在每个节点中除了包含...

    数据结构 双向链表(C++)

    双向链表是一种特殊的数据结构,它在计算机程序设计中扮演着重要角色,特别是在C++这样的编程语言中。本节将深入探讨双向链表的概念、其结构、操作以及C++中的实现。 双向链表与单链表不同,它允许每个节点不仅有一...

    双链表的学习

    双向链表是一种数据结构,它在单链表的基础上增加了向前和向后指针,使得节点不仅可以访问其后继节点,还可以访问其前驱节点。这种数据结构在计算机科学中有着广泛的应用,特别是在需要高效地进行插入、删除操作的...

    stm32f103 双向链表

    在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...

    大数阶乘 双向链表

    本主题聚焦于如何使用双向链表这一数据结构来实现大数阶乘的计算。双向链表允许我们有效地存储和操作大数,同时保持良好的性能。 首先,我们需要了解双向链表的基本概念。双向链表是一种线性数据结构,其中每个节点...

    C语言编写的双向链表

    在编程领域,数据结构是构建复杂算法的基础,而链表作为一种基本的数据结构,常常被用于实现动态内存管理、高效搜索和排序等操作。双向链表是链表的一种变体,它在每个节点中不仅存储了数据,还包含了指向前后节点的...

Global site tag (gtag.js) - Google Analytics