欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不带头单向非循环链表的实现(C语言)

程序员文章站 2024-03-21 13:40:16
...

不带头单向非循环链表的实现


贴一下我的github地址(里面有我原来敲过的一些有意思的代码): 点击转到github

SList.h

#pragma once

typedef int DataType;
typedef struct SListNode
{
	DataType data;
	struct SListNode* next;
}SListNode;
//初始化链表
void SListInit(SListNode** head);
//清空链表
void SListDestory(SListNode** head);
//初始化一个头节点
SListNode* BuySListNode(DataType data);
//尾插一个data
void SListPushBack(SListNode** head, DataType data);
//尾删一个data
void SListPopBack(SListNode** head);
//头插一个data
void SListPushFront(SListNode** head, DataType data);
//头删一个data
void SListPopFront(SListNode** head);
// 任意位置插入
void SListInsert(SListNode* pos, DataType data);
// 任意位置删除
void SListErase(SListNode* pos);
// 链表大小
int SListSize(SListNode* head);
// 寻找data
SListNode* SListFind(SListNode* head, DataType data);
// 显示链表
void PrintSList(SListNode* head);

SList.cpp

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

#include"SList.h"

#include<assert.h>
#include<stdlib.h>


#define _CRTDBG_MAP_ALLOC
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif
//初始化链表
void SListInit(SListNode** head)
{
	assert(head);
	*head = NULL;
}

void SListDestory(SListNode** head)
{
	assert(head);
	SListNode* delNode = NULL;
	while (*head != NULL)
	{
		delNode = *head;
		*head = delNode->next;
		free(delNode);
	}
}
 
SListNode* BuySListNode(DataType data)
{
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));
	if (node == NULL)
	{
		printf("开辟失败!");
		return NULL;
	}
	node->data = data;
	node->next = NULL;

	return node;
}

void SListPushBack(SListNode** head, DataType data)
{
	assert(head);
	if (*head == NULL)
		*head = BuySListNode(data);
	else
	{
		//链表不为空,找到链表中的最后一个节点
		SListNode* cur = *head;
		while (cur->next)
		{
			cur = cur->next;
		}
		cur->next = BuySListNode(data);
	}
}

void SListPopBack(SListNode** head)
{
	assert(head);
	//表为空
	if (*head == NULL)
		return;
	//表中只有一个节点
	else if ((*head)->next == NULL)
	{
		free(*head);
		*head = NULL;
	}
	//表中有多个节点
	else
	{
		SListNode* cur = *head;
		SListNode* prev = NULL;
		while (cur->next)
		{
			prev = cur;
			cur = cur->next;
		}
		free(cur);
		prev->next = NULL;
	}
}

void SListPushFront(SListNode** head, DataType data)
{
	assert(head);
	SListNode* NewNode = BuySListNode(data);
	NewNode->next = *head;
	*head = NewNode;
}

void SListPopFront(SListNode** head)
{
	assert(head);
	SListNode* delNode = NULL;
	if (*head == NULL)
		return;

	delNode = *head;
	*head = delNode->next;
	free(delNode);
}

void SListInsert(SListNode* pos, DataType data)
{
	SListNode* NewNode = NULL;
	if (pos == NULL)
		return;
	NewNode = BuySListNode(data);
	NewNode->next = pos->next;
	pos->next = NewNode;
}

void SListErase(SListNode* pos)
{
	SListNode* delNode;
	if (pos == NULL || pos->next == NULL)
		return;
	delNode = pos->next;
	pos->next = delNode->next;
	free(delNode);
}

int SListSize(SListNode* head)
{
	int count = 0;
	SListNode* cur = head;
	while (cur)
	{
		count++;
		cur = cur->next;
	}

	return count;
}

SListNode* SListFind(SListNode* head, DataType data)
{
	SListNode* cur = head;
	while (cur)
	{
		if (data == cur->data)
			return cur;
		cur = cur->next;
	}
	return NULL;
}
void PrintSList(SListNode* head)
{
	SListNode* cur = head;
	while (cur)
	{
		printf("%d-->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}


test.cpp

#include<stdio.h>
#include <crtdbg.h>
#include"SList.h"

int main()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	SListNode* head;
	SListInit(&head);
	SListPushBack(&head, 1);
	SListPushBack(&head, 2);
	SListPushBack(&head, 3);
	SListPushBack(&head, 4);

	PrintSList(head);

	SListInsert(SListFind(head, 2), 6);

	//SListPopFront(&head);
	//SListPopFront(&head);
	//SListPopFront(&head);
	//SListPopFront(&head);
	//SListPopFront(&head);
	//SListPopFront(&head);

	PrintSList(head);

	SListErase(SListFind(head, 2));
	PrintSList(head);
	SListDestory(&head);
	//如有问题,欢迎指正
	return 0;
}

上一篇: 文档(6)

下一篇: