双向链表基本操作及顺序和链表总结
2023-12-28 12:37:06
目录
?
?
基本函数实现
链表声明
typedef int DLTDataType;
typedef struct DListNode
{
struct DListNode* next;
struct DListNode* prev;
DLTDataType val;
}DLTNode;
总的函数实现声明
//申请新的节点
DLTNode* CreateLTNode(DLTDataType x);
//初始化
DLTNode* DLTInit();
//打印
void DLTPrint(DLTNode* phead);
//头插头删尾插尾删
void DLTPushBack(DLTNode* phead, DLTDataType x);
void DLTPopBack(DLTNode* phead);
void DLTPushFront(DLTNode* phead, DLTDataType x);
void DLTPopFront(DLTNode* phead);
//找x的位置
DLTNode* DLTFind(DLTNode* phead, DLTDataType x);
//在pos前面插入
void DLTInsert(DLTNode* pos, DLTDataType x);
//删除pos位置
void DLTErase(DLTNode* pos);
//销毁链表
void DLTDestroy(DLTNode* phead);
创建一个节点
DLTNode* CreateLTNode(DLTDataType x)
{
DLTNode* newnode = (DLTNode*)malloc(sizeof(DLTNode));
if (newnode == NULL)
{
perror("malloc fail");
exit(-1);
}
newnode->val = x;
newnode->prev = NULL;
newnode->next = NULL;
return newnode;
}
初始化链表
DLTNode* DLTInit()
{
DLTNode* phead = CreateLTNode(-1);
phead->next = phead;
phead->prev = phead;
return phead;
}
打印
void DLTPrint(DLTNode* phead)
{
assert(phead);
printf("哨兵卫<=>");
DLTNode* cur = phead->next;
while (cur != phead)
{
printf("%d<=>", cur->val);
cur = cur->next;
}
printf("\n");
}
尾插
//第一种尾插方式
//void DLTPushBack(DLTNode* phead, DLTDataType x)
//{
// assert(phead);
// DLTNode* tail = phead->prev;
// DLTNode* newnode = CreateLTNode(x);
//
// tail->next = newnode;
// newnode->prev = tail;
// newnode->next = phead;
// phead->prev = newnode;
//}
//第二种尾插方式
void DLTPushBack(DLTNode* phead, DLTDataType x)
{
assert(phead);
DLTInsert(phead, x);
}
尾删
//第一种尾删
//void DLTPopBack(DLTNode* phead)
//{
// assert(phead);
// assert(phead->next != phead);
//
// DLTNode* tail = phead->prev;
// DLTNode* tailPrev = tail->prev;
// free(tail);
// tailPrev->next = phead;
// phead->prev = tailPrev;
//}
//第二种尾删
void DLTPopBack(DLTNode* phead)
{
assert(phead);
assert(phead->next != phead);
DLTErase(phead->prev);
}
头插
//第一种头插方式
//void DLTPushFront(DLTNode* phead, DLTDataType x)
//{
// assert(phead);
// DLTNode* newnode = CreateLTNode(x);
//
// newnode->next = phead->next;
// phead->next->prev = newnode;
// phead->next = newnode;
// newnode->prev = phead;
//}
//第二种头插方式
//void DLTPushFront(DLTNode* phead, DLTDataType x)
//{
// assert(phead);
// DLTNode* newnode = CreateLTNode(x);
// DLTNode* first = phead->next;
//
// phead->next = newnode;
// newnode->prev = phead;
// newnode->next = first;
// first->prev = newnode;
//}
//第三种头插方式
void DLTPushFront(DLTNode* phead, DLTDataType x)
{
assert(phead);
DLTInsert(phead->next, x);
}
头删
第一种头删
//void DLTPopFront(DLTNode* phead)
//{
// assert(phead);
// assert(phead->next != phead);
//
// DLTNode* first = phead->next;
// DLTNode* second = first->next;
// phead->next = second;
// second->prev = phead;
// free(first);
// first = NULL;
//}
//第二种头删
void DLTPopFront(DLTNode* phead)
{
assert(phead);
assert(phead->next != phead);
DLTErase(phead->next);
}
查找
DLTNode* DLTFind(DLTNode* phead, DLTDataType x)
{
assert(phead);
DLTNode* cur = phead->next;
while (cur != phead)
{
if (cur->val == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
pos前插入
//在pos前面插入
void DLTInsert(DLTNode* pos, DLTDataType x)
{
assert(pos);
DLTNode* posPrev = pos->prev;
DLTNode* newnode = CreateLTNode(x);
posPrev->next = newnode;
newnode->prev = posPrev;
newnode->next = pos;
pos->prev = newnode;
}
删除pos位置
//删除pos位置
void DLTErase(DLTNode* pos)
{
assert(pos);
DLTNode* posNext = pos->next;
DLTNode* posPrev = pos->prev;
posPrev->next = posNext;
posNext->prev = posPrev;
free(pos);
pos = NULL;
}
销毁链表
void DLTDestroy(DLTNode* phead)
{
assert(phead);
DLTNode* cur = phead->next;
while (cur != phead)
{
DLTNode* next = cur->next;
free(cur);
cur = next;
}
free(phead);
}
顺序表和链表总结
上方的链表指的是双向链表,顺序表指的是数组顺序表。?
?
?
文章来源:https://blog.csdn.net/qinjh_/article/details/135251574
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!