C语言单链表增删改查的实现

Posted 一只当归

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言单链表增删改查的实现相关的知识,希望对你有一定的参考价值。

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。这篇博客是实现无头单向不循环的链表的头插,尾插,头删,尾删,查找,在某个位置插入,删除某个位置后的值。

//slist.h文件
#pragma once
#include <stdio.h>
typedef int SLDataType;
typedef struct SListNode 
{
	SLDataType data;
	struct SListNode* next;
}SListNode;
void SListPrint(SListNode* pList);  //打印
void SListPushBack(SListNode** ppList,SLDataType x);//尾插
void SListPushFront(SListNode** ppList, SLDataType x);//头插
void SListPopBack(SListNode** ppList);//尾删
void SListPopFront(SListNode** ppList);//头删
SListNode* SListFind(SListNode* pList, SLDataType x);//查找
void SListInsertAfter(SListNode*pos, SLDataType x); //在pos位置之后插入x
void SListEraseAfter(SListNode*pos);//删除pos位置之后的值
//slist.c文件
#define _CRT_SECURE_NO_WARNINGS
#include "slist.h"
void SListPrint(SListNode* pList)
{
	SListNode* cur = pList;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\\n");
}
SListNode* NewSListNode(SLDataType x)
{
	SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));
	newNode->data = x;
	newNode->next = NULL;
	return newNode;
}
void SListPushBack(SListNode** ppList, SLDataType x) //尾插
{
	SListNode* newNode = NewSListNode(x);
	if (*ppList == NULL)
	{
		*ppList = newNode;
	}
	else{
		SListNode* tail = *ppList;
		while (tail->next != NULL)
		{
			tail = tail->next;

		}
		tail->next = newNode;
	}
}
void SListPushFront(SListNode** ppList, SLDataType x)//头插
{
	SListNode* newNode = NewSListNode(x);
	newNode->next = *ppList;
	*ppList = newNode;
}
void SListPopBack(SListNode** ppList)//尾删
{
	if (*ppList == NULL) //空
	{
		return;
	}
	else if ((*ppList)->next == NULL) //只有一个节点
	{
		free(*ppList);
		*ppList = NULL;
	}
	else{  //有多个节点
		SListNode* tail = *ppList;
		SListNode*prev = NULL;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		free(tail);
		prev->next = NULL;
	}
}
void SListPopFront(SListNode** ppList)//头删
{
		SListNode*nextnode = (*ppList)->next;
		free(*ppList);
		*ppList = nextnode;
	}
SListNode* SListFind(SListNode* pList, SLDataType x) //查找
{
	SListNode* cur = pList;
	while (cur)
	{
		if (cur->next == x)
		{
			return cur;
		}
		else
		{
			cur = cur->next;
		}
	}
	return NULL;
}
void SListInsertAfter(SListNode*pos, SLDataType x)//在pos位置之后插入x
{
	SListNode* newnode = NewSListNode(x);
	SListNode* next = pos->next;
	pos->next = newnode;
	newnode->next = next;
}
void SListEraseAfter(SListNode*pos)//删除pos位置之后的值
{
	SListNode* next = pos->next;
	if (next!= NULL)
	{
		next->next = next->next;
		free(next);
	}
}
void TestSList()
{
	SListNode* pList = NULL;
	SListPushBack(&pList, 1);
	SListPushBack(&pList, 2);
	SListPushBack(&pList, 3);
	SListPushBack(&pList, 4);
	SListPrint(pList);

	SListPushFront(&pList, 0);
	SListPrint(pList);

	SListPopBack(&pList);
	SListPrint(pList);

	SListPopFront(&pList);
	SListPrint(pList);

}
int main(){
	TestSList();
	system("pause");
	return 0;
}

以上是关于C语言单链表增删改查的实现的主要内容,如果未能解决你的问题,请参考以下文章

C语言带头双向循环链表增删改查的实现

C语言带头双向循环链表增删改查的实现

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

C语言顺序表的动态存储:增删改查的实现

c语言 建立一个链表,实现增删改查

java实现单链表增删改查