1. 程式人生 > >鏈表API實現(插入,刪除,查找)

鏈表API實現(插入,刪除,查找)

nod 完整 tro log 當前 del list let cnblogs

  使用了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實現(插入,刪除,查找)