使用了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