#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; } }
相关推荐
实现了删除指定值的节点的函数 deleteNode,首先处理链表为空和头节点的情况,然后遍历链表找到要删除节点的前一个节点,并进行删除操作。 实现了打印链表内容的函数 printList,用于验证链表操作的结果。 在 main ...
本文将详细讲解如何使用C语言在Microsoft Visual C++ 6.0环境下实现单向链表的创建、插入、删除节点以及两个链表的合并。 一、单向链表的基本概念 单向链表是一种线性数据结构,每个元素(称为节点)包含两部分:...
在这个“链表演示程序”中,我们将会深入探讨如何实现链表的各种操作,包括插入和删除功能。 首先,让我们了解链表的基本概念。链表不同于数组,它不是一块连续的内存空间,而是由一系列节点组成,每个节点包含数据...
### 如何建立链表及链表的前后插入法 #### 链表基础知识 链表是一种常见的线性数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的指针域。链表相对于数组而言,具有动态分配内存、方便插入与删除等...
首先,`ListInsert_Dul`接受三个参数:一个指向双向链表的引用`L`,一个整数`i`表示要插入的位置,以及要插入的新结点的值`e`。函数的目标是在链表的第`i`个位置插入新结点。 1. `if(!(p=GetElem_DuL(L,i))) ...
在C++中实现红黑树,通常需要定义一个节点结构体,包含键值、颜色、左子节点、右子节点以及父节点等属性,并实现插入和删除操作。 首先,我们来看`RBTree.cpp`和`RBTree.h`这两个文件。`RBTree.h`是头文件,其中会...
- 插入函数:实现向链表中插入节点的逻辑。 - 删除函数:根据给定条件删除节点。 - 遍历函数:按顺序打印链表中的所有节点数据。 - 查找函数:寻找链表中具有特定值的节点。 通过这个实验,你可以了解单链表的工作...
删除操作通常有`erase()`函数,可以按位置或值删除元素。查找操作可以通过迭代器遍历链表,或者使用`find()`函数查找特定元素。 `www.pudn.com.txt`这个文件可能是一个文本文件,可能包含了关于这个话题的额外资源...
下面将详细讨论如何建立、插入和删除双向链表,以及如何判断一个双向链表是否对称。 首先,我们需要定义双向链表的节点结构。一个简单的双向链表节点可以表示为: ```c++ struct Node { int data; Node* prev; ...
ADOQuery 是 Delphi 中用于操作数据库的一个重要组件,它基于 ADO (ActiveX Data Objects) 技术,允许开发者高效地执行 SQL 语句来实现对数据库的查询、插入、删除和修改等操作。在 Delphi 环境中,ADOQuery 组件是...
本文将深入探讨C语言中的一个重要数据结构——双链表,并着重讲解如何在双链表中插入元素以及验证插入操作是否成功,同时讨论双链表的可扩展性。 双链表是一种线性数据结构,它不仅包含每个节点的数据部分,还包含...
实验步骤包括初始化链表、向链表中填充数据、非递减排序以及插入和删除元素等部分: 1. **初始化链表**:函数`InitLinkList`创建一个空链表,通过动态分配内存来创建头节点,然后将其next指针设置为NULL。 2. **...
### 基于链表的插入、删除、...综上所述,通过上述五个操作,可以有效地实现链表的基本管理功能,包括插入、删除、逆置、合并以及节点交换。这些操作是链表数据结构的基础,并且对于理解和掌握链表的动态特性至关重要。
下面我们将依次探讨插入、判断表是否为空、遍历、获取指定位置元素、查找、获取前后继、删除、清空和销毁顺序表这九个功能。 1. 插入操作:在顺序表的某个位置插入一个新元素,首先需要确保有足够的空间。如果当前...
4. **链表的操作**:包括初始化(创建空链表)、插入(在头部、尾部或特定位置插入节点)、删除(按值或位置删除节点)、遍历(访问链表中的所有元素)和反转(改变链表中节点的顺序)等。这些操作都需要对链表节点...
这些控件内建了强大的事件系统,允许开发者在进行数据操作前后的不同阶段插入自定义的逻辑处理。 在进行数据插入、更新和删除操作时,通常会触发一系列的事件,这些事件为开发者提供了在不同操作阶段进行干预的机会...
在C++编程中,双向链表是一种非常重要的数据结构,它允许我们在列表的任一位置进行插入和删除操作。双向链表与单链表的区别在于每个节点不仅包含数据,还包含两个指针,一个指向其前一个节点(pre指针),另一个指向...
- 断开待删除节点与其前后节点之间的连接,并释放内存。 #### 六、修改特定节点的值 - **函数定义**: ```c struct Student* alter(struct Student *head, long num, float score); ``` - **功能**:根据提供...