C实现单链表

SingleList.h

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

typedef struct SingleListNode
{
	DateType Date;
	struct SingleListNode* next;
}SingleListNode;

void SingleListInit(SingleListNode* sl);
void SingleListDestroy(SingleListNode* sl);

void SingleListPushback(SingleListNode* sl, DateType x);
void SingleListPushFront(SingleListNode* sl, DateType x);
void SingleListInsertAfter(SingleListNode* pos, DateType x);

void SingleListPopFront(SingleListNode* sl);
void SingleListPopBack(SingleListNode* sl);
void SingleListEraseAfter(SingleListNode* pos);

SingleListNode* CreatNote(DateType x);
void SingleListPrint(SingleListNode* sl);
void SingleListRemove(SingleListNode* sl, DateType x);
DateType SingleListCheck(SingleListNode* sl, DateType x);
void SingleListRemoveAll(SingleListNode* sl, DateType x);

SingleList.c

#include"SingleList.h"
//无头单项非循环
void SingleListInit(SingleListNode* sl)
{
	assert(sl);
	sl->next = NULL;
}

void SingleListDestroy(SingleListNode* sl)
{
	assert(sl);
	SingleListNode* cur = sl->next;
	while (cur)
	{
		SingleListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	sl->next = NULL;
}
void SingleListPushback(SingleListNode* sl, DateType x)
{
	assert(sl);
	if (sl->next == NULL)
	{
		sl->next = CreatNote(x);
	}
	else
	{
		SingleListNode* cur = sl->next;
		while (cur->next)
		{
			cur = cur->next;
		}
		cur->next = CreatNote(x);
	}
}

void SingleListPushFront(SingleListNode* sl, DateType x)
{
	assert(sl);
	SingleListNode* cur = sl->next;
	SingleListNode* newNote = CreatNote(x);
	newNote->next = cur;
	sl->next = newNote;
}

void SingleListInsertAfter(SingleListNode* pos, DateType x)
{
	assert(pos);
	SingleListNode* newNote = CreatNote(x);
	SingleListNode* next = pos->next;
	pos->next = newNote;
	newNote->next = next;
}

void SingleListPopFront(SingleListNode* sl)
{
	assert(sl);
	SingleListNode* cur, *next;
	if (sl->next == NULL)
	{
		return;
	}
	cur = sl->next;
	next = cur->next;
	free(cur);
	cur = NULL;
	sl->next = next;
}

void SingleListPopBack(SingleListNode* sl)
{
	assert(sl);
	SingleListNode* prev = NULL;
	SingleListNode* cur = sl->next;
	if (cur == NULL)
	{
		return;
	}
	else
	{
		while (cur->next)
		{
			prev = cur;
			cur = cur->next;	
		}
		free(cur);
		cur = NULL;
		if (prev == NULL)
		{
			sl->next = NULL;
		}
		else
		{
			prev->next = NULL;
		}
	}
}

void SingleListEraseAfter(SingleListNode* pos)
{
	assert(pos);
	SingleListNode* next = pos->next;
	if (next == NULL)
	{
		return;
	}
	pos->next = next->next;
	free(next);
	next = NULL;
}

SingleListNode* CreatNote(DateType x)
{
	SingleListNode* node = (SingleListNode*)malloc(sizeof(SingleListNode));
	assert(node);
	node->Date = x;
	node->next = NULL;
	return node;
}


void SingleListRemove(SingleListNode* sl, DateType x)
{
	assert(sl);
	SingleListNode* cur = sl->next;
	SingleListNode* prev = NULL;
	while (cur)
	{
		if (cur->Date == x)
		{
			if (prev == NULL)
			{
				sl->next = cur->next;
			}
			else
			{
				prev->next = cur->next;
			}
			free(cur);
			cur = NULL;
		}
		else
		{
			prev = cur;
			cur = cur->next;
		}
	}
}

DateType SingleListCheck(SingleListNode* sl, DateType x)
{
	assert(sl);
	SingleListNode* cur = sl->next;
	while (cur)
	{
		if (cur->Date == x)
		{
			return 1;
		}
		else
		{
			cur = cur->next;
		}
	}
	return 0;
}

void SingleListRemoveAll(SingleListNode* sl, DateType x)
{
	assert(sl);
	while (SingleListCheck(sl,x) == 1)
	{
		SingleListRemove(sl, x);
	}
}

void SingleListPrint(SingleListNode* sl)
{
	assert(sl);
	SingleListNode* cur = sl->next;
	while (cur)
	{
		printf("%d->", cur->Date);
		cur = cur->next;
	}
	printf("\n");
}

void testSingleList()
{
	SingleListNode sl;
	SingleListInit(&sl);

	SingleListPushback(&sl, 1);
	SingleListPushFront(&sl, 2);
	SingleListPushFront(&sl, 3);
	SingleListPushback(&sl, 3);
	SingleListPrint(&sl);

	//SingleListPopBack(&sl);
	//SingleListPopFront(&sl);
	SingleListRemoveAll(&sl, 3);
	SingleListPrint(&sl);
	SingleListDestroy(&sl);
}

int main()
{
	testSingleList();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值