波奇学数据结构:双向带头链表

本文展示了如何使用C语言创建一个双向带头链表,包括初始化、头插、尾插、插入、删除节点等操作,所有操作都通过通用的插入和删除函数实现,提高了代码复用性。
摘要由CSDN通过智能技术生成

1.链表单位再加一个prev指针指向前一个结构体实现双向,

  1. 再加多一个哨兵卫头节点避免了头插代码的特殊性

头文件:

#pragma once
#include<stdlib.h>
#include<stdio.h>
//链表单位
typedef int SLTD;
typedef struct SLT
{
SLTD value ;
struct SLT* prev ;
struct SLT* next;
}SLT;
SLT* BuySLT(SLTD x);
void InitSLT(SLT*phead);
void PushbackSLT(SLT*phead,SLTD x);
void PushfrontSLT(SLT*phead,SLTD x);
void PopbackSLT(SLT*phead);
void PopfrontSLT(SLT*phead);
void InsertSLT(SLT*phead, SLT* pos, SLTD x);
void EraseSLT(SLT*phead, SLT* pos);
void Print(SLT* phead);

双向带头链表源代码,注意头插尾插都可以复用插入代码

#include"SLT.h"
SLT* BuySLT(SLTD x)
{
SLT* p = (SLT*)malloc(sizeof(SLT));

if (!p)
{
return NULL;
}
else
{
p->value = x;
return p;
}
}
void InitSLT(SLT*phead)
{
phead->prev = phead;
phead->next = phead;

}
void PushbackSLT(SLT*phead, SLTD x)
{
InsertSLT(phead, phead, x);
/*SLT* nextSLT= BuySLT(x);
SLT* prevSLT= phead->prev;
prevSLT->next = nextSLT;
nextSLT->prev = prevSLT;
nextSLT->next = phead;
phead->prev = nextSLT;*/

}
void PushfrontSLT(SLT* phead, SLTD x)
{
InsertSLT(phead, phead->next, x);
/*SLT* curSLT = BuySLT(x);
SLT* nextSLT = phead->next;
nextSLT->prev = curSLT;
curSLT->next = nextSLT;
curSLT->prev = phead;
phead->next = curSLT;*/

}
void PopbackSLT(SLT* phead)
{
EraseSLT(phead, phead->prev);
/*if (phead->next == phead)
{
return;
}
SLT* prevSLT = phead->prev->prev;
SLT* PopSLT = phead->prev;
prevSLT->next = phead;
phead->prev = prevSLT;
free(PopSLT);
PopSLT = NULL;
return ;*/
}
void PopfrontSLT(SLT* phead)
{
EraseSLT(phead, phead->next);
/*if (phead->next == phead)
{
return ;
}
SLT* PopSLT = phead->next;
SLT* nextSLT = phead->next->next;
phead->next = nextSLT;
nextSLT->prev = PopSLT;
free(PopSLT);
PopSLT = NULL;*/
}
//在pos前插入数据
void InsertSLT(SLT* phead,SLT*pos,SLTD x)
{
SLT* nextSLT = BuySLT(x);
SLT* prevSLT = pos->prev;
prevSLT->next = nextSLT;
nextSLT->prev = prevSLT;
nextSLT->next = pos;
pos->prev = nextSLT;
}
void EraseSLT(SLT* phead,SLT*pos)
{
if (phead->next == phead)
{
return;
}
SLT* nextSLT = pos->next;
SLT* prevSLT = pos->prev;
prevSLT->next = nextSLT;
nextSLT->prev = prevSLT;
free(pos);
pos = NULL;
}
void Print(SLT* phead)
{
SLT* cur = phead;
printf("<<head>>");
while (cur->next != phead)
{
cur = cur->next;
printf("%d>>", cur->value);
}
printf("\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值