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

Posted 南瓜小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表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();

}

 

以上是关于链表API实现(插入,删除,查找)的主要内容,如果未能解决你的问题,请参考以下文章

链表及其各种函数操作的实现方法

NetBSD Make源代码阅读三:链表之插入查找删除与对每个节点应用函数

《线性表的插入和删除算法实现》以及《栈和队列的插入和删除算法实现》的c语言代码

Java 实现有序链表

如何实现一个LRU算法?

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)