今天学习了线性表中的双向链表,接下来我将实现基于双向链表的插入删除操作。
节点结构的定义:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int Datatype;
typedef struct ListNode
{
Datatype val;
struct ListNode* prev;
struct ListNode* next;
}LN;
LN* LNbuynode(Datatype x);
void Init(LN** pphead);
void LNprint(LN* phead);
void LNpushback(LN* phead, Datatype x);
void LNfrontback(LN* phead, Datatype x);
void LNpushpop(LN* phead);
void LNfrontpop(LN* phead);
测试程序:
#include"List.h"
void test01()
{
LN* phead = NULL;
Init(&phead);
}
int main()
{
test01();
return 0;
}
开辟节点与初始化:
LN* LNbuynode(Datatype x)//开辟新节点
{
LN* newnode = (LN*)malloc(sizeof(LN));
//判断新节点是否开辟成功
if (newnode == NULL)
{
perror("malloc fail!");
exit(1);
}
newnode->val = x;
//新节点的next、prev指针都指向自己
newnode->prev = newnode;
newnode->next = newnode;
return newnode;
}
void Init(LN** pphead)//初始化双向链表
{
*pphead = LNbuynode(-1);//开辟头结点
}
头插&尾插&打印链表:
void LNprint(LN* phead)//打印双向链表
{
LN* pcur = phead->next;
while (pcur != phead)
{
printf("%d->", pcur->val);
pcur = pcur->next;
}
printf("\n");
}
void LNpushback(LN* phead, Datatype x)//双链表尾插方法
{
assert(phead);
LN* newnode = LNbuynode(x);
newnode->prev = phead->prev;
newnode->next = phead;
phead->prev->next = newnode;
phead->prev = newnode;
}
void LNfrontback(LN* phead, Datatype x)//双链表头插方法
{
assert(phead);
LN* newnode = LNbuynode(x);
newnode->next = phead->next;
newnode->prev = phead;
phead->next->prev = newnode;
phead->next = newnode;
}
头删&尾删:
测试:
1.尾插:
2.头插:
3.尾删:
4.头删: