无头单向非循环链表增删查改实现

无头单向非循环链表:

结构简单,一般不会单独用来存数据。

实际中更多的是作为其他数据结构的子结构,如哈希表、图的领接等等。

下面,我们来看看无头单向非循环链表增删查改实现。

SList.h(函数声明)

#ifndef _SLIST_H_
#define _SLIST_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>


// 无头单向非循环链表增删查改实现 

typedef int SLTDataType;

typedef struct SListNode{
	SLTDataType data;
	struct SListNode*next;

}SListNode;

typedef struct SList{
	SListNode* head;
}SList;

void SListInit(SList* plist);
void SListDestory(SList* plist);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
SListNode* SListFind(SList* plist, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SList* pos, SLTDataType x);
void SListEraseAfter(SList* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);


#endif/*_SLIST_H_*/

SList.c(函数实现)

#include"SList.h"
#include<stdio.h>


SListNode* BuySListNode(SLTDataType x)//创建结点
{
	SListNode* res = 
	res = (SListNode*)malloc(sizeof(SListNode));
	if (res == NULL)
	{
		printf("创建结点失败");
		return NULL;
	}
	res->data = x;
	res->next = NULL;
	return res;
}

void SListInit(SList* plist)
{
	plist->head=NULL;
}

void SListPushFront(SList* plist, SLTDataType x)//头插
{
	SListNode* tmp = BuySListNode(x); 
	if (tmp != NULL)
	{
		tmp->next = plist->head;
		plist->head = tmp;
	}
}
void SListPopFront(SList* plist)//头删
{
	if (NULL != plist->head)
	{
		SListNode* pt = plist->head;
		plist->head = pt->next;
		free(pt);
	}
}

void SListInsertAfter(SListNode* pos, SLTDataType x)
{
	SListNode* tmp = BuySListNode(x);
	tmp->next = pos->next;
	pos->next = tmp;
}
void SListEraseAfter(SListNode* pos)//删除pos+1位置结点
{
	SListNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
}

SListNode* SListFind(SList* plist, SLTDataType x)//查询指定值
{
	SListNode* tmp=plist->head;
	while (tmp!= NULL)
	{
		if (tmp->data == x)
			return tmp;
		else
			tmp = tmp->next;
	}
	return NULL;
}

void SListRemove(SList* plist, SLTDataType x)//删除值为x的结点
{
	while (plist->head != NULL&&plist->head->data == x)
	{
		SListPopFront(plist);
	}
	if (plist->head == NULL)
	{
		return;
	}
	SListNode* ph = plist->head;
	SListNode* pt = ph->next;
	while (NULL != pt)
	{
		if (pt->data == x)
		{
			pt = pt->next;
			SListEraseAfter(ph);
			ph->next = pt;
			continue;
		}
		pt = pt->next;
		ph = ph->next;
	}

}
		
void SListPrint(SList* plist)
{
	SListNode* pt = plist->head;
	while (NULL != pt)
	{
		printf("%d->", pt->data);
		pt = pt->next;
	}
	printf("\n");
}

void SListDestory(SList* plist)
{
	if (plist->head != NULL)
	{
		SListNode*pt = plist->head;
		while (pt!=NULL)
		{
			SListNode* t=pt;
			pt = pt->next;
			free(t);
		}
		plist->head = NULL;
	}
}

main.c(测试函数)

#include"SList.h"

int main()
{
	SList test;

	SListInit(&test);

	SListPushFront(&test, 1);
	SListPushFront(&test, 2);
	SListPushFront(&test, 3);
	SListNode* tmp = test.head->next->next;
	SListInsertAfter(tmp, 4);
	SListInsertAfter(tmp, 4);
	SListInsertAfter(tmp, 5);
	SListInsertAfter(tmp, 6);
    //打印
    SListPrint(&test);
	SListRemove(&test, 6);
	SListPrint(&test);
	//摧毁
	SListDestory(&test);

	system("pause");
	return 0;
}
发布了83 篇原创文章 · 获赞 26 · 访问量 8723

猜你喜欢

转载自blog.csdn.net/lexiaoyao_0000/article/details/96436018