单链表简单实现(一)-创新互联
功能实现:
站在用户的角度思考问题,与客户深入沟通,找到南澳网站设计与南澳网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广、域名与空间、虚拟主机、企业邮箱。业务覆盖南澳地区。尾插
头插
头删
尾删
在指定索引位置增删
先创建一个结构体
#pragma once
#includeusing namespace std;
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data;
//指向下一个结构体的指针
struct SListNode* next;
}SLNode;
打印结构体里面的数据函数
void sout(SListNode* pphead)
{
SListNode* temp = pphead;
while (temp != NULL)
{
cout<< temp->data<< endl;
temp = temp->next;
}
}
//创建一个SListNode*节点
SListNode* initListNode(SLTDateType x)
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if (newnode == NULL)
{
cout<< "节点创建失败"<< endl;
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
实现尾插
这里要改变指针指向所以要传二级指针
void SListPushBack(SListNode** pphead, SLTDateType x)
{
//创建一个新节点存数据
SListNode* newnode = initListNode(x);
//防止空指针
if (*pphead == NULL)
{
*pphead = newnode;
}
else
{
SListNode* tail = *pphead;
//找到尾节点
while (tail->next != NULL)
{
tail = tail->next;
}
//尾节点的指针指向新开辟的结构体地址
tail->next = newnode;
}
}
简单测试一下
int main()
{
SListNode* plist = NULL;
SListPushBack(&plist, 1);
SListPushBack(&plist, 2);
SListPushBack(&plist, 3);
sout(plist);
}
头插
void SListPushFront(SListNode** pphead, SLTDateType x)
{
SListNode* newnode = initListNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
尾删
void SListPopBack(SListNode** pphead)
{
//空
if (*pphead == NULL) return;
//一个节点
if ((*pphead)->next == NULL)
{
free(*pphead);
*pphead = NULL;
}
//三个及以上
else
{
SListNode* tail = *pphead;
SListNode* tail2 = NULL;//记录倒数第二个
while (tail->next != NULL)
{
tail2 = tail;
tail = tail->next;
}
tail2->next = NULL;
free(tail);
tail = NULL;
}
}
测试一下
头删
void SListPopFront(SListNode** pphead)
{
if (*pphead == NULL)
return;
SListNode* head = ( * pphead)->next;
free(*pphead);//释放删除节点的空间
*pphead = head;
}
查找,返回的是这个节点的指针,为下面的插入可以服务
SListNode* SListFind(SListNode* phead, SLTDateType x)
{
SListNode* temp = phead;
while (temp )
{
if ((temp->data )== x)
return temp;
else
temp = temp->next;
}
return NULL;
}
插入指定位置前
//在POS位置前插入x
void SListInsertForward(SListNode** pphead, SListNode* pos, SLTDateType x)
{
SListNode* newnode = initListNode(x);
if (*pphead == pos)//pos是第一个节点
{
newnode->next= *pphead;
*pphead = newnode;
}
else
{
SListNode* posPrev = *pphead;
while (posPrev->next != pos)
{
posPrev = posPrev->next;
}
posPrev->next = newnode;
newnode->next = pos;
}
}
插入指定位置后
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
assert(pos);
SListNode* newnode = initListNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
删除指定元素
void SListErase(SListNode** pphead, SListNode* pos)
{
assert(pphead);
if (*pphead == pos)//pos是第一个节点
{
*pphead = pos->next;
free(pos);
//或调用头删SListPopFront(pphead);
}
else
{
SListNode* prev = *pphead;
while (prev->next!=pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
//pos = NULL;没必要
}
}
删除指定元素后一个
void SListEraseAfter(SListNode* pos)
{
if (pos->next = NULL)return;
SListNode* next = pos->next;
pos->next = next->next;
free(next);
}
删除链表
void SListDeatory(SListNode** pphead)
{
assert(pphead);
SListNode* temp = *pphead;
while (temp)
{
SListNode* next = temp->next;
free(temp);
temp = next;
}
*pphead = NULL;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文标题:单链表简单实现(一)-创新互联
当前网址:http://cdiso.cn/article/dpjigh.html