链表API实现(插入,删除,查找)

  使用了NIL来当做链表的头和尾,构建的时候也用插入函数插入,在遍历的时候只要判断当前的指针指向的内容是不是NIL即可。

关于NIL节点的使用:

Node NIL;
Node *nil = &NIL;

关于内存池的使用:

Node pool[MAX];
int poolIndex;
Node* getnew(){

    return &pool[poolIndex++];

}

插入的时候对于四个指针进行操作:

    NewNode->pre = dstNode;
    NewNode->next = dstNode->next;

    dstNode->next->pre = NewNode;
    dstNode->next = NewNode;

删除的时候对于要删除的节点的前一个节点和后一个节点的两个指针的操作:

    node->pre->next = node->next;
    node->next->pre = node->pre;

完整测试代码:

#include <stdio.h>
#include <malloc.h>
#define MAX 100000
typedef struct node{
    int data;
    struct node *next;
    struct node *pre;
}Node;
Node NIL;
Node *nil = &NIL;
Node pool[MAX];
int poolIndex;
Node* getnew(){

    return &pool[poolIndex++];

}
void listInit(){

    nil->next = nil;
    nil->pre = nil;
    nil->data = 0;

}

void listInsertAfter(Node*dstNode,Node*NewNode){

    NewNode->pre = dstNode;
    NewNode->next = dstNode->next;

    dstNode->next->pre = NewNode;
    dstNode->next = NewNode;

}

void listDelete(Node*node){

    node->pre->next = node->next;
    node->next->pre = node->pre;

}

Node* search(int key){
    Node *x = nil->next;//从表头的下一个元素开始找
    while (x != nil&&x->data !=key){
        x = x->next;
    }
    return x;//可能返回NIL或者找到的数据的地址
}

void showList(){
    Node * x = nil->next;//从第一个元素开始显示
    while (x != nil){
        printf("%d\n", x->data);
        x = x->next;
    }

}
//主函数实现的功能:在链表中添加1到20的数字,然后找到2的位置在它后面添加一个22,然后再利用删除函数删除。
int main(){
    listInit();
    Node *dstnode = getnew();
    dstnode = nil;
    for (int i = 1; i <= 20; i++){
        Node * newnode = getnew();
        newnode->data = i;
        listInsertAfter(dstnode,newnode);
        dstnode = newnode;

    }
    dstnode = search(2);
    Node * newnode = getnew();
    newnode->data = 22;
    listInsertAfter(dstnode, newnode);
    showList();
    dstnode = search(22);

    listDelete(dstnode);
    showList();

}
时间: 2024-10-16 19:08:17

链表API实现(插入,删除,查找)的相关文章

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

[PHP] 数据结构-链表创建-插入-删除-查找的PHP实现

链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到 插入元素1.插入元素和查找类似,找到位置后2.生成新的结点s, s->next=p->next p->next=s; 删除元素1.删除元素,找到位置后2.绕过一下,q=p->next p->next=q->next; <?php class Node{ public $data

链表 创建 插入 删除 查找 合并

最近学习了一下单链表的操作,将代码保存如下,供以后查看. 链表创建: 1.先建立一个不含数据的头指针*head,头指针的链接域为NULL. 2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head. 3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc. #define _CRT_SECURE_NO_DEPRECATE /*取消scanf,printf不安全之类的错误

ios 字符串的插入删除查找与替换,删除空格

NSString *str1 = @"This is a example.";  NSMutableString *mstr = [[NSMutableString alloc] init]; //创建可变字符串  NSRange substr; //子字符串的范围mstr = [NSMutableString stringWithString:str1];  //插入字符  [mstr insertString:@"very easy " atIndex:10];

单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)

typedef struct node//该结构体代表一个结点{ int data; //结点的数据域 struct node *next; //结点的指针域}lnode,*linklist; //定义一个结构体变量和指向结构体的指针//用头插法创建一个链表linklist create_begin(){ linklist head=(linklist)malloc(sizeof(lnode));//定义头结点并开辟空间 head->next=NULL; //为避免指针乱指,将头结点下一个指针赋

静态链表 初始化 定位 Malloc Free 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define MAX_SIZE 1000;//表最大空间 /* //线性表的基本操

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历