娄底网站设计做网站优化
news/
2025/9/23 7:11:06/
文章来源:
娄底网站设计,做网站优化,nginx wordpress动静分离,杭州服装网站建设文章目录
前言 一、单链表是什么#xff1f;二、单链表的实现总结 顺序表的缺点 1.中间/头部的插入删除#xff0c;时间复杂度为O (N) 2.realloc 扩容#xff08;特别是异地扩#xff0c;需要申请新空间#xff0c;拷贝数据#xff0c;释放旧空间#xff09;会有不小的…
文章目录
前言 一、单链表是什么二、单链表的实现总结 顺序表的缺点 1.中间/头部的插入删除时间复杂度为O (N) 2.realloc 扩容特别是异地扩需要申请新空间拷贝数据释放旧空间会有不小的消耗。 3.增容一般是呈2倍的增长势必会有一定的空间浪费。 例如当前容量为100满了以后增容到200我们再继续插入了5个数据后面没有数据插入了那么就浪费了95个数据空间。 针对顺序表的缺点设计了链表 一、单链表是什么 链表是数据结构之一其中的数据呈线性排列。在链表中数据的添加和删除都较为方便就是访问比较耗费时间。
1.2结构
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;}SLTNode;
这就是单链表的经典结构
其实一个链表还分逻辑模型和物理模型
逻辑模型 物理模型 二.单链表的实现接口函数的实现
2.1打印
打印只有一个细节就是cur cur-nextcur是一个结构体指针可以通过-去访问成员他的意思就是往下去遍历。
void SListPrint(SLTNode* phead)
{SLTNode* cur phead;while (cur ! NULL){printf(%d-, cur-data);cur cur-next;}
}
2.2检查扩容
和之前的顺序表的思路是一样的单链表也是需要检查扩容的如果满了就要扩如果少了就要增。
SLTNode* BuyListNode(SLTDateType x)
{SLTNode* newnode (SLTNode*)malloc(sizeof(SLTNode));newnode-data x;newnode-next NULL;if (newnode NULL){printf(malloc fail\n);exit(-1);}return newnode;
}
2.3尾插 利用两个指针先检查扩容如果是空的就增容然后先找到尾然后在把新开辟的内存链接起来就可以了。
void SListPushBack(SLTNode** pphead, SLTDateType x)
{SLTNode* newnode BuyListNode(x);if (*pphead NULL){*pphead newnode;}else{//找到尾节点SLTNode* tail *pphead;while (tail-next ! NULL){tail tail-next;}tail-next newnode;}
}
2.4头插 注意要不要传2级指针只有判断是否使用phead void SListPushFront(SLTNode** pphead, SLTDateType x)
{SLTNode* newnode BuyListNode(x);newnode-next *pphead;*pphead newnode;}
2.5尾删 尾删有两个方法两个指针和单指针 两个指针法
将最后一组元素释放在将最后一个元素置空但是一个节点要单独考虑
void SListPopBack(SLTNode** pphead)
{assert(*pphead ! NULL);if ((*pphead)-next NULL){free(*pphead);*pphead NULL;}else{SLTNode* prev NULL;SLTNode* tail *pphead;while (tail-next ! NULL){prev tail;tail tail-next;}free(tail);tail NULL;prev-next NULL;}
}
单指针法
void SListPopBack(SLTNode** pphead)
{SLTNode*tail*pphead; assert(*pphead ! NULL);if ((*pphead)-next NULL){free(*pphead);*pphead NULL;}while(tail-next-next!NULL){tailtail-next;
}free(tail-next);tail-nextNULL;
}
2.6头删
保存下一节点next删除头节点将头节点赋值为next。
void SListPopFront(SLTNode** pphead)
{assert(*pphead ! NULL);SLTNode* next (*pphead)-next;free(*pphead);*pphead next;
}2.7查找
SLTNode* SListFind(SLTNode* phead, SLTDateType x)
{SLTNode* cur phead;while (cur ! NULL){if (cur-data x){return cur;}else{cur cur-next;}}return NULL;
}
2.8在pos位置之前去插入一个节点 先要找到他的位置找到pos之前的位置
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{SLTNode* newnode BuyListNode(x);if (*pphead pos){newnode-next *pphead;*pphead newnode;}else//找到pos之前的位置{SLTNode* posprev *pphead;while (posprev-next ! pos){posprev posprev-next;}posprev-next newnode;newnode-next pos;}
}2.8在pos位置之后去插入一个节点
void SListInsertAfter(SListNode* pos, SListData x)
{assert(pos);SListNode* newnode BuyListNode(x);SListNode* next pos-next;pos-next newnode;pos-next-next next;
}2.9在pos位置去删去一个结点头要特殊处理
void SListInsert(SListNode** pphead, SListNode* pos, SListData x)
{assert(pphead);assert(pos);if (pos *pphead) {*ppheadpos-next;free(pos);}else{SListNode* pre *pphead;//找到前一个while (pre-next ! pos) {pre pre-next;}pre-next pos-next;//前一个指向后一个free(pos);}
}
3.0销毁还原
void SListDestory(SLTNode**pphead)
{SLTNode*cur*pphead;while(cur!NULL)
{SLTNode*nextcur-next;free(cur);curnext;
}*ppheadNULL;
} 总结
单链表的缺点就是不可以随机访问而顺序表却可以做到说明单链表也有缺陷那什么结构可以让我们更好只有继续的学习才会知道。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911699.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!