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

实现前后插入,以及按值删除

 
阅读更多

 

#ifndef _LINK_NODE_
#define _LINKE_NODE_

typedef struct Node {

  struct Node* pNext;

  void* pData;

} NodeStruct, *pNodeStruct;




typedef struct SingleLinkedList {

  pNodeStruct pHead;

  pNodeStruct pTail;

} SingleLinkedListStruct, *pSingleLinkedListStruct;

void init(pSingleLinkedListStruct*);
void destory(pSingleLinkedListStruct*);
void display(pSingleLinkedListStruct);
void insertFront(pSingleLinkedListStruct*,void*);
void insertTail(pSingleLinkedListStruct*,void*);
void deleteNode(pSingleLinkedListStruct*,void*,int (*compare)(void*,void*));
 
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);
 
printf("------删除前--------\n");	
	display(pt);
	deleteNode(&pt,&e,cmp);
	//deleteNode(&pt,&c,cmp);
printf("------删除后--------\n");		
	display(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;
			(*p)->pHead=currentNode;
			(*p)->pTail=currentNode;

        }
		else
		{
			currentNode->pNext=(*p)->pHead;
			(*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;
			(*p)->pHead=currentNode;
			(*p)->pTail=currentNode;
	}
	else
	{
			currentNode->pNext=NULL;
			(*p)->pTail->pNext=currentNode;
			(*p)->pTail=currentNode;
	}

}


void deleteNode(pSingleLinkedListStruct* p,void* data,int (*compare)(void*,void*))
{
	pNodeStruct cp=(*p)->pHead;
	pNodeStruct pre;
	while(cp)
	{
		if(compare(cp->pData,data))
		{
			if(cp==(*p)->pHead)
			{
				(*p)->pHead=(*p)->pHead->pNext;
				return;
			}
			else
			{
				pre->pNext=cp->pNext;
				return;
			}

		}
		
		pre=cp;
		cp=cp->pNext;
		
	}
}

  

分享到:
评论

相关推荐

    基于C语言实现单链表的插入和删除(源码)

    实现了删除指定值的节点的函数 deleteNode,首先处理链表为空和头节点的情况,然后遍历链表找到要删除节点的前一个节点,并进行删除操作。 实现了打印链表内容的函数 printList,用于验证链表操作的结果。 在 main ...

    C语言实现单向链表的创建、插入,删除节点,和2个链表合并

    本文将详细讲解如何使用C语言在Microsoft Visual C++ 6.0环境下实现单向链表的创建、插入、删除节点以及两个链表的合并。 一、单向链表的基本概念 单向链表是一种线性数据结构,每个元素(称为节点)包含两部分:...

    链表演示程序 插入删除等功能的实现

    在这个“链表演示程序”中,我们将会深入探讨如何实现链表的各种操作,包括插入和删除功能。 首先,让我们了解链表的基本概念。链表不同于数组,它不是一块连续的内存空间,而是由一系列节点组成,每个节点包含数据...

    如何建立链表及链表的前后插入法,求源代码?

    ### 如何建立链表及链表的前后插入法 #### 链表基础知识 链表是一种常见的线性数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的指针域。链表相对于数组而言,具有动态分配内存、方便插入与删除等...

    双向链表插入删除基本操作演示.ppt

    首先,`ListInsert_Dul`接受三个参数:一个指向双向链表的引用`L`,一个整数`i`表示要插入的位置,以及要插入的新结点的值`e`。函数的目标是在链表的第`i`个位置插入新结点。 1. `if(!(p=GetElem_DuL(L,i))) ...

    红黑树的c++实现

    在C++中实现红黑树,通常需要定义一个节点结构体,包含键值、颜色、左子节点、右子节点以及父节点等属性,并实现插入和删除操作。 首先,我们来看`RBTree.cpp`和`RBTree.h`这两个文件。`RBTree.h`是头文件,其中会...

    数据结构试验之单链表的实现

    - 插入函数:实现向链表中插入节点的逻辑。 - 删除函数:根据给定条件删除节点。 - 遍历函数:按顺序打印链表中的所有节点数据。 - 查找函数:寻找链表中具有特定值的节点。 通过这个实验,你可以了解单链表的工作...

    ListLink.rar_stl list_单链表_单链表 插入 删除 查找_链表 插入

    删除操作通常有`erase()`函数,可以按位置或值删除元素。查找操作可以通过迭代器遍历链表,或者使用`find()`函数查找特定元素。 `www.pudn.com.txt`这个文件可能是一个文本文件,可能包含了关于这个话题的额外资源...

    双向链表的基本操作建立,插入,删除

    下面将详细讨论如何建立、插入和删除双向链表,以及如何判断一个双向链表是否对称。 首先,我们需要定义双向链表的节点结构。一个简单的双向链表节点可以表示为: ```c++ struct Node { int data; Node* prev; ...

    C语言 双链表 插入指定位置查证 可扩展

    本文将深入探讨C语言中的一个重要数据结构——双链表,并着重讲解如何在双链表中插入元素以及验证插入操作是否成功,同时讨论双链表的可扩展性。 双链表是一种线性数据结构,它不仅包含每个节点的数据部分,还包含...

    ADOQuery连接数据库的查询、插入、删除、修改

    ADOQuery 是 Delphi 中用于操作数据库的一个重要组件,它基于 ADO (ActiveX Data Objects) 技术,允许开发者高效地执行 SQL 语句来实现对数据库的查询、插入、删除和修改等操作。在 Delphi 环境中,ADOQuery 组件是...

    数据结构单链表的插入和删除实验报告.pdf

    实验步骤包括初始化链表、向链表中填充数据、非递减排序以及插入和删除元素等部分: 1. **初始化链表**:函数`InitLinkList`创建一个空链表,通过动态分配内存来创建头节点,然后将其next指针设置为NULL。 2. **...

    基于链表的插入 删除 逆置 合并 交换

    ### 基于链表的插入、删除、...综上所述,通过上述五个操作,可以有效地实现链表的基本管理功能,包括插入、删除、逆置、合并以及节点交换。这些操作是链表数据结构的基础,并且对于理解和掌握链表的动态特性至关重要。

    用指针实现数据结构顺序表的几种功能

    下面我们将依次探讨插入、判断表是否为空、遍历、获取指定位置元素、查找、获取前后继、删除、清空和销毁顺序表这九个功能。 1. 插入操作:在顺序表的某个位置插入一个新元素,首先需要确保有足够的空间。如果当前...

    严蔚敏-数据结构--链表实现c++实现

    4. **链表的操作**:包括初始化(创建空链表)、插入(在头部、尾部或特定位置插入节点)、删除(按值或位置删除节点)、遍历(访问链表中的所有元素)和反转(改变链表中节点的顺序)等。这些操作都需要对链表节点...

    在ASP.NET 2.0中操作数据之十七:研究插入、更新和删除的关联事件

    这些控件内建了强大的事件系统,允许开发者在进行数据操作前后的不同阶段插入自定义的逻辑处理。 在进行数据插入、更新和删除操作时,通常会触发一系列的事件,这些事件为开发者提供了在不同操作阶段进行干预的机会...

    c++双向链表的建立于插入

    在C++编程中,双向链表是一种非常重要的数据结构,它允许我们在列表的任一位置进行插入和删除操作。双向链表与单链表的区别在于每个节点不仅包含数据,还包含两个指针,一个指向其前一个节点(pre指针),另一个指向...

    有建立 输出 插入 删除 修改功能的单项动态链表

    - 断开待删除节点与其前后节点之间的连接,并释放内存。 #### 六、修改特定节点的值 - **函数定义**: ```c struct Student* alter(struct Student *head, long num, float score); ``` - **功能**:根据提供...

Global site tag (gtag.js) - Google Analytics