无法跳转到建设银行网站,企业网站建设收费标准,分类信息网站开发报价,做微信平台图片网站双向链表的接口实现#xff08;附图解和源码#xff09; 文章目录双向链表的接口实现#xff08;附图解和源码#xff09;前言一、定义结构体二、接口实现#xff08;附图解源码#xff09;1.初始化双向链表2.开辟新空间3.尾插数据4.尾删数据5.打印双向链表中数据6.头插数…双向链表的接口实现附图解和源码 文章目录双向链表的接口实现附图解和源码前言一、定义结构体二、接口实现附图解源码1.初始化双向链表2.开辟新空间3.尾插数据4.尾删数据5.打印双向链表中数据6.头插数据7.头删数据8.查找结点位置9.在pos位置之前插入10.删除pos位置11.销毁双向链表三、源代码展示1.test.c测试主函数2.List.h接口函数的声明3.List.c接口函数的实现总结前言
本文主要介绍双向链表中增删查改等接口实现结尾附总源码 一、定义结构体 代码如下示例 typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* prev;struct ListNode* next;
}ListNode;二、接口实现附图解源码 这里一共10个接口我会我都会一 一为大家讲解图解源码 1.初始化双向链表
初始化出一个哨兵位的头结点用malloc开辟next和prev都指向自己。具体如下图 代码如下示例 ListNode* ListInit()
{ListNode* p (ListNode*)malloc(sizeof(ListNode));if (p NULL){perror(errno);}ListNode* phead p;phead-next phead;phead-prev phead;return phead;
}2.开辟新空间
(1)开辟一个链表类型的动态空间将地址给newnode (2)将值放入 newnode 的 data 数据内 (3)将 newnode 的 next 和 prev 都置为NULL 注意1.将malloc开辟空间存到 newnode 里面时参数为结构体所占的字节大小2.对 newnode 进行 NULL 判断 代码如下示例 ListNode* BuyListNode(LTDataType x)
{ListNode* p (ListNode*)malloc(sizeof(ListNode));if (p NULL){perror(errno);}ListNode* newNode p;newNode-data x;newNode-next NULL;newNode-prev NULL;return newNode;
}3.尾插数据 代码如下示例 void ListPushBack(ListNode* phead, LTDataType x)//尾插数据
{ListNode* tail phead-prev;ListNode* newnode BuyListNode(x);//第一个链接tail-next newnode;newnode-prev tail;//第二个链接phead-prev newnode;newnode-next phead;
}4.尾删数据
这里需要两次进行断言 代码如下示例 void ListPopBack(ListNode* phead)//尾删
{assert(phead);assert(phead-next ! phead);ListNode* tail phead-prev;ListNode* tailprev tail-prev;free(tail);//连接tailprev-next phead;phead-prev tailprev;
}5.打印双向链表中数据 代码如下示例 void ListPrint(ListNode* phead)//打印数据
{assert(phead);ListNode* cur phead-next;while (cur ! phead){printf(%d , cur-data);cur cur-next;}printf(\n);
}6.头插数据
头插数据也是很简单的一个接口链接两次即可如下图 代码如下示例 void ListPushFront(ListNode* phead, LTDataType x)//头插
{assert(phead);ListNode* newNode BuyListNode(x);ListNode* next phead-next;phead-next newNode;newNode-prev phead;newNode-next next;next-prev newNode;
}7.头删数据
在头删数据时和尾删数据一样都需要进行两次断言如下图 代码如下示例 void ListPopFront(ListNode* phead)//头删
{assert(phead);assert(phead-next ! phead);ListNode* next phead-next;ListNode* nextNext next-next;phead-next nextNext;nextNext-prev phead;free(next);
}8.查找结点位置
这个比较简单和单链表一样直接用cur遍历即可直接上代码 代码如下示例 ListNode* ListFind(ListNode* phead, LTDataType x)
{assert(phead);ListNode* cur phead-next;while (cur ! phead){if (cur-data x){return cur;}cur cur-next;}return NULL;
}9.在pos位置之前插入 代码如下示例 void ListInsert(ListNode* pos, LTDataType x)//pos位置之前插入
{assert(pos);ListNode* newNode BuyListNode(x);ListNode* posPrev pos-prev;// posPrev newnode posposPrev-next newNode;newNode-prev posPrev;newNode-next pos;pos-prev newNode;
}根据ListInsert接口我们可以把头插和尾插进行改版如下图 10.删除pos位置 代码如下示例 void ListErase(ListNode* pos)//删除pos位置
{assert(pos);ListNode* prev pos-prev;ListNode* next pos-next;free(pos);pos NULL;prev-next next;next-prev prev;
}11.销毁双向链表 代码如下示例 void ListDestory(ListNode* phead)
{assert(phead);ListNode* cur phead-next;while (cur ! phead){ListNode* next cur-next;free(cur);cur next;}free(phead);phead NULL;
}三、源代码展示
1.test.c测试主函数 代码如下示例 #include list.h
void Testlist1()
{ListNode* n1 ListInit();ListPushBack(n1, 1);//尾插ListPushBack(n1, 2);//尾插//ListPushBack(n1, 3);//尾插//ListPushBack(n1, 4);//尾插//ListPushBack(n1, 5);//尾插//ListPopFront(n1);//头删//ListPopBack(n1);//尾删//ListPushFront(n1, 0);//头插ListPrint(n1);
}
void Testlist2()
{ListNode* n1 ListInit();ListPushBack(n1, 1);//尾插ListPushBack(n1, 2);//尾插ListPushBack(n1, 3);//尾插ListPushBack(n1, 4);//尾插ListPushBack(n1, 5);//尾插ListNode* p ListFind(n1, 5);printf(%d \n, p-data);
}
void Testlist3()
{ListNode* n1 ListInit();ListPushBack(n1, 1);//尾插ListPushBack(n1, 2);//尾插ListPushBack(n1, 3);//尾插ListPushBack(n1, 4);//尾插ListPushBack(n1, 5);//尾插//ListNode* p ListFind(n1, 5);//ListInsert(p, 0);ListDestory(n1);ListPrint(n1);
}
int main()
{//Testlist1();//Testlist2();Testlist3();return 0;
}2.List.h接口函数的声明 代码如下示例 #include stdio.h
#include stdlib.h
#include assert.h
#include errno.h
typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* prev;struct ListNode* next;
}ListNode;
ListNode* ListInit();//初始化双向链表
void ListPushBack(ListNode* phead, LTDataType x);//尾插
void ListPopBack(ListNode* phead);//尾删
void ListPushFront(ListNode* phead, LTDataType x);//头插
void ListPopFront(ListNode* phead);//头删
void ListPrint(ListNode* phead);//打印
ListNode* ListFind(ListNode* phead, LTDataType x);//查找数据
void ListInsert(ListNode* pos, LTDataType x);//pos位置之前插入
void ListErase(ListNode* pos);//删除pos位置
void ListDestory(ListNode* phead);//销毁双向链表3.List.c接口函数的实现 代码如下示例 #include list.h
ListNode* ListInit()
{ListNode* p (ListNode*)malloc(sizeof(ListNode));if (p NULL){perror(errno);}ListNode* phead p;phead-next phead;phead-prev phead;return phead;
}
ListNode* BuyListNode(LTDataType x)
{ListNode* p (ListNode*)malloc(sizeof(ListNode));if (p NULL){perror(errno);}ListNode* newNode p;newNode-data x;newNode-next NULL;newNode-prev NULL;return newNode;
}
void ListPushBack(ListNode* phead, LTDataType x)//尾插数据
{ListNode* tail phead-prev;ListNode* newnode BuyListNode(x);//第一个链接tail-next newnode;newnode-prev tail;//第二个链接phead-prev newnode;newnode-next phead;//ListInsert(phead, x);
}
void ListPrint(ListNode* phead)//打印数据
{assert(phead);ListNode* cur phead-next;while (cur ! phead){printf(%d , cur-data);cur cur-next;}printf(\n);
}
void ListPopBack(ListNode* phead)//尾删
{assert(phead);assert(phead-next ! phead);ListNode* tail phead-prev;ListNode* tailprev tail-prev;free(tail);//连接tailprev-next phead;phead-prev tailprev;
}
void ListPushFront(ListNode* phead, LTDataType x)//头插
{assert(phead);ListNode* newNode BuyListNode(x);ListNode* next phead-next;phead-next newNode;newNode-prev phead;newNode-next next;next-prev newNode;//ListInsert(phead-next, x);
}
void ListPopFront(ListNode* phead)//头删
{assert(phead);assert(phead-next ! phead);ListNode* next phead-next;ListNode* nextNext next-next;phead-next nextNext;nextNext-prev phead;free(next);
}
ListNode* ListFind(ListNode* phead, LTDataType x)
{assert(phead);ListNode* cur phead-next;while (cur ! phead){if (cur-data x){return cur;}cur cur-next;}return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)//pos位置之前插入
{assert(pos);ListNode* newNode BuyListNode(x);ListNode* posPrev pos-prev;// posPrev newnode posposPrev-next newNode;newNode-prev posPrev;newNode-next pos;pos-prev newNode;
}
void ListErase(ListNode* pos)//删除pos位置
{assert(pos);ListNode* prev pos-prev;ListNode* next pos-next;free(pos);pos NULL;prev-next next;next-prev prev;
}
void ListDestory(ListNode* phead)
{assert(phead);ListNode* cur phead-next;while (cur ! phead){ListNode* next cur-next;free(cur);cur next;}free(phead);phead NULL;
}总结
以上就是今天要讲的内容本文介绍双向链表的接口实现附图解和源码。 如果我的博客对你有所帮助记得三连支持一下感谢大家的支持