数据结构-单链表基本操作(c语言实现)

Posted 许同学。。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-单链表基本操作(c语言实现)相关的知识,希望对你有一定的参考价值。

1.申请空间并初始化

SLNode* BuySLNode(DateType x)
{
	SLNode*node = (SLNode*)malloc(sizeof(SLNode) * 1);
	if (node == NULL)
	{
		printf("failed to open up capacity");
	}
	node->date = x;
	node->next = NULL;
	return node;
}

相对于顺序表,按需求去申请空间,不存在空间浪费问题 

2.头插(头插多个节点以便于其他接口的测试)

void SListPushFront(SLNode**plist,DateType x)
{
	assert(plist);
	SLNode*newnode = BuySLNode(x);
	newnode->date = x;
	newnode->next = *plist;
	*plist = newnode;
}

3.查找数据

SLNode* SListFind(SLNode**plist, DateType x)
{
	assert(plist);
	SLNode*cur = *plist;
	while (cur)
	{
		if (cur->date == x)
		{
			return cur;
		}
		else
			cur = cur->next;
	}
	return NULL;
}

函数最后返回SLNode*的指类型的好处(可以修改当前数据 有利于后面接口的测试) 。

4.修改数据

void SListModify(SLNode*pos, DateType x)
{
	assert(pos);
	pos->date = x;
}

5.在pos的下一个位置插入一个节点

void SListInsertAfter(SLNode*pos, DateType x)//在pos的下一个节点插入一个节点
{
	assert(pos);//防止传的是空指针
	SLNode*next = pos->next;
	SLNode*newnode = BuySLNode(x);
	pos->next = newnode;
	newnode->next = next;
}

6.在pos的上一个位置插入一个节点

void SListInsertBefore(SLNode**plist, SLNode*pos, DateType x)//在pos的前一个节点插入一个节点
{
	assert(pos);
	assert(plist);
	SLNode*newnode = BuySLNode(x);
	if (pos == *plist)
	{
		newnode->next = *plist;
		*plist = newnode;
	}//考虑pos的位置在第一个节点,即头插
	else
	{
		SLNode*prev = *plist;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = newnode;
		newnode->next = pos;
	}//多个节点的时候
	
}

这里需要考虑pos在第一个节点与在其它节点的时候。

7.将pos的下一个节点 删除

void SListEraseAfter(SLNode*pos)//将pos的下一个节点删除
{
	assert(pos);
	if (pos->next == NULL)
	{
		return;
	}
	else
	{
		SLNode*next = pos->next;
		pos->next = next->next;
		free(next);
		next = NULL;
	}
}

这里需要考虑pos在第一个节点与在其它节点的时候。

8.将pos所在的当前节点删除

void SListEraseCur(SLNode**plist,SLNode*pos)//删除当前节点
{
	assert(pos);
	if (pos == *plist)
	{
		SLNode*next = (*plist)->next;
		free(pos);
		pos = NULL;
		*plist = next;
	}//考虑的是pos的位置在第一个节点处
	else
	{
		SLNode*next = pos->next;
		SLNode*prev = *plist;
		while (prev->next != pos)
		{
			prev = prev->next;

		}
		free(pos);
		pos = NULL;
		prev->next = next;
	}

}

这里需要考虑pos在第一个节点与在其它节点的时候。相对于顺序表的插入与删除数据 ,链表不用挪动数据,效率提高。

9.释放空间

void SListDestory(SLNode**plist)
{
	assert(plist);
	SLNode*cur = *plist;
	while (cur)
	{
		SLNode*next = cur->next;
		free(cur);
		cur = next;
	}
    *plist = NULL;//防止*plist成为野指针
}

因为申请了空间,所以一定要释放空间,不然会导致内存泄漏的问题。这里传一级指针的话,主函数里的SLNode*phead会成为野指针。如果传了一级指针的话,还需要在主函数里将SLNode*phead制空

10.打印(为了测试各个接口)

void Print(SLNode**plist)
{
	assert(plist);
	SLNode*cur = *plist;
	while (cur)
	{
		printf("%d->", cur->date);
		cur = cur->next;
	}
	printf("NULL\\n");
}//为了测试接口

11.测试

void test()
{
	SLNode*phead = BuySLNode(4);
	SListPushFront(&phead, 2);
	SListPushFront(&phead, 3);
	Print(&phead);
	SLNode*pos = SListFind(&phead, 3);
	if (pos)
	{
		/*pos->date = 20;*///如果查找数据成功,也可以改变当前数据
		printf("date found\\n");
	}
	else
	{
		printf("date not found");
	}
	SListModify(pos,20);
	Print(&phead);
	SListInsertAfter( pos, 4);//pos的下一个位置插入一个节点
	Print(&phead);
	SListInsertBefore(&phead, pos, 5);//pos的前一个位置插入一个节点
	Print(&phead);
	SListEraseAfter(pos);//消除pos的下一个节点
	Print(&phead);
	SListEraseCur(&phead, pos);//消除当前pos的位置的节点
	Print(&phead);
	SListDestory(&phead);
}

11.测试结果 :

 

链表的增删查改就分享到这里了,感谢你的浏览。如果感兴趣的话,可以给个关注,

下期将发布与双向链表相关的基本操作文章。 

以上是关于数据结构-单链表基本操作(c语言实现)的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现单链表基本操作

数据结构单链表的介绍和基本操作(C语言实现)保姆级别详细教学

单链表的基本操作操作,类C语言

单链表基本功能的实现(C语言)

数据结构-单链表基本操作(c语言实现)

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。