Additions and deletions to change search function C language to achieve a single list

Concept: a list on a physical storage structure discontinuous, non-sequential storage structure , the logical order of the data elements in the list by the pointer link implementation order.

Headless directed acyclic chain (single chain): simple structure, the stored data is generally not used alone. More practical substructure as other data structures such as hash bucket, the adjacency list, etc. FIG.
Here Insert Picture Description
Here Insert Picture Description
Here Insert Picture Description
I.e. without first head element is effective element, i.e. directed acyclic only after the next node pointer to a link.
Function definition header file

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

// 单向+不带头+非循环
typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SListNode;

SListNode* BuySListNode(SLTDateType x);//创建节点
void SListPrint(SListNode* plist);//打印链表
void SListPushBack(SListNode** pplist, SLTDateType x);//尾插,因为会修改链表结构,故要用二级指针来接收一级指针的参数
void SListPushFront(SListNode** pplist, SLTDateType x);//头插
void SListPopBack(SListNode** pplist);//尾删
void SListPopFront(SListNode** pplist);//头删
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);//返回一个节点

void SListInsertAfter(SListNode* pos, SLTDateType x);//pos后插入

void SListEraseAfter(SListNode* pos);//pos后删除
void SListDestory(Slist* plist);

Function function to achieve

#include"SList.h"


SListNode* BuySListNode(SLTDateType x)
{	
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));
	node->data = x;
	node->next = NULL;
	return node;
}
void SListPrint(SListNode* plist)
{
	SListNode* cur = plist;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
void SListPushBack(SListNode** pplist, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	if (*pplist == NULL)//没有节点时直接覆盖
	{
		*pplist = newnode;
	}
	else//不为空时链接到尾部
	{
		SListNode* tail = *pplist;
		while (tail->next)
		{
			tail = tail->next;
		}//先找到尾节点
		tail -> next = newnode;//在直接链接
	}
}
void SListPushFront(SListNode** pplist, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	if (*pplist == NULL)//为空时直接覆盖
	{
		*pplist = newnode;
	}
	else//为空
	{
		newnode->next = *pplist;//头插
		*pplist = newnode;//更新头部
	}
}
void SListPopBack(SListNode** pplist)//尾删
{
	SListNode* prev = NULL;
	SListNode* tail = *pplist;
	if (*pplist == NULL || tail->next == NULL)//为空或者只有一个节点
	{
		free(tail);
		*pplist == NULL;
	}
	else//有两个以上节点
	{
		while (tail->next)
		{
			prev = tail;//保留前一个结点
			tail = tail->next;
		}
		free(tail);
		tail = NULL;
		prev->next = NULL;

	}
}
void SListPopFront(SListNode** pplist)//头删
{
	SListNode* prev = *pplist;
	if (*pplist == NULL || prev->next == NULL)//为空或只有一个节点
	{
		free(prev);
		*pplist = NULL;
	}
	else
	{
		SListNode* next = prev->next;//先保留下一个
		free(prev);
		*pplist = next;//更新头部
	}
}

// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
	if (plist == NULL)
	{
		return NULL;
	}
	SListNode* cur = plist;
	while (cur->next)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
	assert(pos);
	SListNode* cur = pos;
	SListNode* newnode = BuySListNode(x);
	newnode->next = cur->next->next;
	cur->next = newnode;
}

// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{
	assert(pos);
	SListNode* next= pos->next;//保留pos下一个节点
	if (next)
	{
		pos->next = next->next;
		free(next);
	}
}

function test

#include <stdio.h>

#include "SList.h"

void TestSList1()
{
	SListNode* plist = NULL;
	SListPushBack(&plist, 1);
	SListPushBack(&plist, 2);
	SListPushBack(&plist, 3);
	SListPushBack(&plist, 4);

	SListPrint(plist);

	SListPopBack(&plist);
	SListPrint(plist);

	SListPopBack(&plist);
	SListPrint(plist);

	SListPopBack(&plist);
	SListPrint(plist);

	SListPopBack(&plist);
	SListPrint(plist);
}

void TestSList2()
{
	SListNode* plist = NULL;
	SListPushFront(&plist, 1);
	SListPushFront(&plist, 2);
	SListPushFront(&plist, 3);
	SListPushFront(&plist, 4);

	SListPrint(plist);
}
void TestSList3()
{
	SListNode* plist = NULL;
	SListPushBack(&plist, 1);
	SListPushBack(&plist, 2);
	SListPushBack(&plist, 3);
	SListPushBack(&plist, 4);
	SListNode* ret=SListFind(plist,2);//查找返回的是节点,或者为空
	if (ret != NULL)
		ret->data = 100;//找到后修改这个节点的值
	SListPrint(plist);


	SListNode* pos = SListFind(plist, 100);
	SListInsertAfter(pos, 200);//两个功能配合使用,先找到节点,再传参,再在此节点后插入
	SListPrint(plist);


	SListNode* pos1 = SListFind(plist, 100);
	SListEraseAfter(pos1);
	SListPrint(plist);

	
}

int main()
{
	TestSList3();

	return 0;
}
Published 29 original articles · won praise 8 · views 2001

Guess you like

Origin blog.csdn.net/qq_44785014/article/details/103527068