接上文双链表上
双链表查找(ListFind)
说明:只需定义一个指针从头遍历一遍结束即可。
ListNode* ListFind(ListNode* phead, LTDatatype x)//查找数据x
{
assert(phead);
ListNode* cur = phead->next;//phead为哨兵节点
while (cur!= phead)
{
if (cur->data == x)
{
return cur; //返回x出现的地址位置
}
cur = cur->next;
}
return NULL;
}
双链表任意位置插入(ListInsert)
说明:在pos位置前插入数据 ,注意要开辟内存。
插入的方法和双链表头插方法类似,详见看双链表上 。
void ListInsert(ListNode* pos, LTDatatype x)//在pos位置前插入x
{
assert(pos);
ListNode* prev = pos->prev;// 记录pos前一个节点的地址
ListNode* newnode = BuyListNode(x); //开辟内存
//位置图
//prev---newnode---pos
prev->next = newnode;
newnode->prev = prev;
pos->prev = newnode;
newnode->next = pos;
}
有了以上这个接口,双链表的头插尾插也可以复用这个接口(ListInsert)
//phead为哨兵节点
//......头插复用......
ListInsert(phead->next, x);
//......
//......尾插复用......
ListInsert(phead->prev, x);
双链表任意位置删除 (ListErase)
说明:在pos位置删除值和前文双链表上中的头删方法类似,这里不过多讲述
void ListErase(ListNode* pos)//删除pos位置的值
{
assert(pos);
ListNode* prev = pos->prev;
ListNode* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);//不用忘记释放内存
pos = NULL;
}
同样有了这个接口,双链表的头删和尾删也可以复用
//......头删复用......
ListErase(phead->next);
//......尾删复用......
ListErase(phead->prev);
//......
双链表打印(ListPrint)
void ListPrint(ListNode* phead)
{
assert(phead);
ListNode* cur = phead;
while (cur->next!=phead)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
双链表销毁(ListDestroy)
void ListDestroy(ListNode* phead)
{
assert(phead);
ListNode* cur = phead->next;//从头节点开始
while (cur != phead)
{
ListNode* next = cur->next; //记录要销毁节点的下一节点,这样依次找到下一节点
free(cur);
cur = next;
}
free(phead);//释放哨兵节点
phead = NULL;
}
双链表使用
说明:在main中,双链表一般创建指针来使用 ,
并且使用链表时要有头文件<stdlib.h>(内存函数) ,<assert.h>(断言)等。
int main()
{
ListNode* s1 = ListInit();//创建指针
ListPushback(s1, 1);
ListPushback(s1, 2);
ListPushback(s1, 3);
ListPushback(s1, 4);
return 0;
}
完