【数据结构】双链表

        带头双向循环链表。

List.h

#pragma once

#include<stddef.h>//NULL
#include<stdlib.h>//free
#include<assert.h>//assert

typedef int SLDataType;

typedef struct SLNode
{
	SLDataType data;
	struct SLNode* prev;
	struct SLNode* next;
} SLNode;

SLNode* SLInit();

void SLPushFront(SLNode* head, SLDataType x);
void SLPushBack(SLNode* head, SLDataType x);
SLDataType SLPopBack(SLNode* head);
SLDataType SLPopFront(SLNode* head);
SLDataType SLErase(SLNode* Del);
void SLInsertBF(SLNode* AFnode, SLDataType x);
void SLInsertAF(SLNode* AFnode, SLDataType x);
void SLDestroy(SLNode** phead);

List.c

#include"List.h"

static SLNode* BuySLNode(SLDataType x)
{
	SLNode* newNode = (SLNode*)malloc(sizeof(SLNode));
	if (NULL == newNode)
	{
		perror("malloc failed");
		exit(-1);
	}
	newNode->data = x;
	newNode->prev = newNode;
	newNode->next = newNode;
	return newNode;
}




SLNode* SLInit()
{
	return BuySLNode(0);
}

void SLPushFront(SLNode* head, SLDataType x)
{
	assert(head);
	//SLInsertBF(head->next, x);
	SLInsertAF(head, x);
}

void SLPushBack(SLNode* head, SLDataType x)
{
	assert(head);
	//SLInsertBF(head, x);
	SLInsertAF(head->prev, x);
}

SLDataType SLPopBack(SLNode* head)
{
	assert(head);
	assert(head->prev != head);
	return SLErase(head->prev);
}


SLDataType SLPopFront(SLNode* head)
{
	assert(head);
	assert(head->next != head);
	return SLErase(head->next);
}

SLDataType SLErase(SLNode* Del)
{
	assert(Del);
	Del->prev->next = Del->next;
	Del->next->prev = Del->prev;
	SLDataType ret = Del->data;
	free(Del);
	return ret;
}

void SLInsertBF(SLNode* AFnode, SLDataType x)
{
	assert(AFnode);
	SLNode* newnode = BuySLNode(x);
	AFnode->prev->next = newnode;
	newnode->prev = AFnode->prev;
	AFnode->prev = newnode;
	newnode->next = AFnode;
}

void SLInsertAF(SLNode* BFnode, SLDataType x)
{
	assert(BFnode);
	SLNode* newnode = BuySLNode(x);
	BFnode->next->prev = newnode;
	newnode->next = BFnode->next;
	BFnode->next = newnode;
	newnode->prev = BFnode;
}

void SLDestroy(SLNode** phead)
{
	while ((*phead)->next != *phead)
		SLPopBack(*phead);
	free(*phead);
}

test.c

#include<stdio.h>
#include"List.h"

void print(SLNode* head)
{
	SLNode* Head = head;
	head = head->next;
	printf("Head<->");
	while (Head != head)
	{
		printf("%d<->", head->data);
		head = head->next;
	}
	printf("Head\n");
}


void test1()
{
	SLNode* list1 = SLInit();
	SLPushBack(list1, 1);
	SLPushBack(list1, 2);
	SLPushBack(list1, 3);
	SLPushBack(list1, 4);
	SLPushFront(list1, 11);
	SLPushFront(list1, 22);
	print(list1);
	printf("Del = %d\n", SLPopBack(list1)); print(list1);
	printf("Del = %d\n", SLPopFront(list1)); print(list1);

	SLDestroy(&list1);
}

int main()
{
	test1();

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值