无头单链表的各种操作(结点定义,销毁,头插,尾插,头删,尾删,给定值删,给定位置插入,给定位置删除,查找等操作)

assert定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include <assert.h>

如:assert(First)

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int DataType;

typedef struct SListNode {
	DataType data;  // 值 
	struct SListNode *Next;  // 指向下一个结点 
} SListNode;

// 初始化 
void SListInit(SListNode **First)
{
	assert(First);
	*First= NULL;
}

//创建结点
SListNode * CreateNode(DataType data)
{
	SListNode * NewNode = (SListNode *)malloc(sizeof(SListNode));
	assert(NewNode);
	NewNode->Next = NULL;
	NewNode->data = data;
	return NewNode;
}

// 尾部插入 
void SListPushBack(SListNode** First, DataType data)
{
	assert(First);
	SListNode * NewNode = CreateNode(data);
	if (*First == NULL)
	{
		*First = NewNode;
		return;
	}
	else
	{
		SListNode * Node = *First;
		for (Node; Node->Next != NULL; Node = Node->Next)
		{}
		Node->Next = NewNode;
	}
}

// 头部插入 
void SListPushFront(SListNode **First, DataType data)
{
	assert(First);
	SListNode * NewNode = CreateNode(data);
	NewNode->Next = *First;
	*First = NewNode;
}

// 尾部删除
void SListPopBack(SListNode **First)
{
	assert(First);
	assert(*First);
	SListNode * Node = *First;
	if (Node->Next == NULL)
	{
		free(Node);
		*First = NULL;
		return 0;
	}
	for (Node; Node->Next->Next != NULL; Node = Node->Next)
	{}
	free(Node->Next);
	Node->Next = NULL;
}

// 头部删除 
void SListPopFront(SListNode **First)
{
	assert(First);
	assert(*First);
	SListNode *Node = *First;
	*First = (*First)->Next;
	free(Node);
}

// 给定结点插入,插入到结点前 
void SListInsert(SListNode **First, SListNode *Pos, DataType data)
{
	assert(First);
	assert(Pos);
	SListNode * NewNode = CreateNode(data);
	SListNode * Node = *First;
	if (*First == NULL)
	{
		*First = NewNode;
		return ;
	}
	for (Node; Node->Next != Pos; Node = Node->Next)
	{}
	Node->Next = NewNode;
	NewNode->Next = Pos;
}

// 给定结点删除
void SListErase(SListNode **First, SListNode *Pos)
{
	assert(First);
	assert(*First);
	assert(Pos);
	SListNode * Node = *First;
	if (Pos == *First)
	{
		(*First)= Pos->Next;
		free(Pos);
		return ;
	}
	for (Node; Node->Next != Pos; Node = Node->Next)
	{}
	Node->Next = Pos->Next;
	free(Pos);
}

// 按值删除,只删遇到的第一个 
void SListRemove(SListNode **First, DataType data)
{
	assert(First);
	assert(*First);
	SListNode * Node = *First;
	SListNode * NNode = Node->Next;
	if ((*First)->data == data)
	{
		*First = (*First)->Next;
		free(Node);
		return ;
	}
	for (Node; (NNode->data != data) && (Node != NULL); Node = Node->Next,NNode = Node->Next)
	{}
	if (NNode->data == data)
	{
		Node->Next = NNode->Next;
		free(NNode);
	}
	else
		printf("没找到\n");
}

// 按值删除,删除所有的
void SListRemoveAll(SListNode **First, DataType data)
{
	assert(First);
	assert(*First);
	SListNode * cur = *First;
	SListNode * per= NULL;
	while (cur)
	{
		if (cur->data == data)
		{
			if (*First == cur)
			{
				*First = cur->Next;
				free(cur);
				cur = *First;
			}
			else
			{
				per->Next = cur->Next;
				free(cur);
				cur = per->Next;
			}
		}
		else
		{
			per = cur;
			cur = cur->Next;
		}
	}
	}

// 销毁 
void SListDestroy(SListNode **First)
{
	assert(First);
	SListNode * Node = *First;
	SListNode * NNode = (*First)->Next;
	if (NNode == NULL)
		free(NNode);
	for (Node; Node != NULL; Node = Node->Next, NNode = NNode->Next)
	{
		free(Node);
		(*First)->Next = NNode;
	}
}

// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL 
SListNode * SListFind(SListNode *First, DataType data)
{
	assert(First);
	SListNode * Node = First;
	for (Node; Node->data != data&&Node != NULL; Node = Node->Next)
	{}
	if (Node->data == data)
	{
		return Node;
	}
	else
		return NULL;
}

//打印
void Pirntf(SListNode *First)
{
	assert(First);
	SListNode * Node;
	for (Node = First; Node != NULL; Node = Node->Next)
	{
		printf("%d->", Node->data);
	}
	printf("\n");
}

void test()
{
	SListNode *A;
	SListInit(&A);
	SListPushBack(&A, 3);
	SListPushBack(&A, 3);
	SListPushBack(&A, 4);
	SListPushBack(&A, 3);
	SListPushBack(&A, 4);
	SListPushBack(&A, 3);
	SListPushBack(&A, 5);
	SListPushBack(&A, 4);
	SListPushBack(&A, 6);
	SListPushFront(&A, 2);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 1);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	SListPushFront(&A, 3);
	printf("初始状态为:");
	Pirntf(A);
	printf("尾删:");
	SListPopBack(&A);
	Pirntf(A);
	printf("头删:");
	SListPopFront(&A);
	Pirntf(A);
	printf("按位置插入第二个:");
	SListInsert(&A, A->Next, 7);
	Pirntf(A);
	printf("按位置删除第三个:");
	SListErase(&A, A->Next->Next);
	Pirntf(A);
	printf("按位置删除第 二个:");
	SListErase(&A, A->Next);
	Pirntf(A);
	printf("按位置删除第一个:");
	SListErase(&A, A);
	Pirntf(A);
	printf("删第一个4:");
	SListRemove(&A, 4);
	Pirntf(A);
	printf("删所有的3:");
	SListRemoveAll(&A, 3);
	Pirntf(A);
	printf("找到4:");
	SListFind(A, 4);
	SListDestroy(&A);
}

int main()
{
	test();
}

猜你喜欢

转载自blog.csdn.net/Sophiahaha/article/details/83036583